Cú pháp
javascript: alert[
new function[a]{
this.f=eval["instance:"+a+"="+function[]{}]
}["A"] . toSource[]
];
alert[eval["instance:A"]];
1 ngụ ý một đối tượng với các giá trị thuộc tính là chức năng, javascript: alert[
new function[a]{
this.f=eval["instance:"+a+"="+function[]{}]
}["A"] . toSource[]
];
alert[eval["instance:A"]];
2, được lập chỉ mục bởi tên, javascript: alert[
new function[a]{
this.f=eval["instance:"+a+"="+function[]{}]
}["A"] . toSource[]
];
alert[eval["instance:A"]];
3. Do đó javascript: alert[
new function[a]{
this.f=eval["instance:"+a+"="+function[]{}]
}["A"] . toSource[]
];
alert[eval["instance:A"]];
4.Thus
javascript: alert[
new function[a]{
this.f=eval["instance:"+a+"="+function[]{}]
}["A"] . toSource[]
];
alert[eval["instance:A"]];
4.javascript: alert[
new function[a]{
this.f=eval["instance:"+a+"="+function[]{}]
}["A"] . toSource[]
];
alert[eval["instance:A"]];
5 sẽ bảo tồn nhận dạng tên chức năng. Xem ghi chú dưới đây về javascript: alert[
new function[a]{
this.f=eval["instance:"+a+"="+function[]{}]
}["A"] . toSource[]
];
alert[eval["instance:A"]];
6.So,
javascript: alert[
new function[a]{
this.f={"instance:1":function[]{}, "instance:A":function[]{}} ["instance:"+a]
}["A"] . toSource[]
];
Hiển thị
javascript: alert[
new function[a]{
this.f=eval["instance:"+a+"="+function[]{}]
}["A"] . toSource[]
];
alert[eval["instance:A"]];
7 trong Firefox. .[This is almost the same idea as this solution, only it uses a generic object and no longer directly populates the window object with the functions.]
Phương pháp này rõ ràng cư trú môi trường với
javascript: alert[
new function[a]{
this.f=eval["instance:"+a+"="+function[]{}]
}["A"] . toSource[]
];
alert[eval["instance:A"]];
8.javascript: alert[
new function[a]{
this.f=eval["instance:"+a+"="+function[]{}]
}["A"] . toSource[]
];
alert[eval["instance:A"]];
Hiển thị
[{f:[function [] {}]}]
và
function [] {
}
Mặc dù hàm tài sản
javascript: alert[
new function[a]{
this.f=eval["instance:"+a+"="+function[]{}]
}["A"] . toSource[]
];
alert[eval["instance:A"]];
9 tham chiếu một [{f:[function [] {}]}]
0 chứ không phải javascript: alert[
new function[a]{
this.f=eval["instance:"+a+"="+function[]{}]
}["A"] . toSource[]
];
alert[eval["instance:A"]];
8, phương pháp này tránh được một số vấn đề với giải pháp này.javascript: alert[
new function[a]{
eval["this.f=function instance"+a+"[]{}"]
}["A"] . toSource[]
];
alert[instanceA]; /* is undefined outside the object context */
Chỉ hiển thị
[{f:[function instanceA[] {}]}]
6 nhúng làm cho JavaScriptjavascript: alert[ new function[a]{ this.f=eval["instance:"+a+"="+function[]{}] }["A"] . toSource[] ]; alert[eval["instance:A"]];
3 không hợp lệ.[{f:[function [] {}]}]
- Thay vì tham chiếu, định nghĩa văn bản thực tế của hàm được phân tích cú pháp và giải thích bởi
4.[{f:[function [] {}]}]
Những điều sau đây không nhất thiết là vấn đề,
- Hàm
5 không có sẵn trực tiếp để sử dụng làm[{f:[function [] {}]}]
6[{f:[function [] {}]}]
Và vì vậy phù hợp hơn nhiều với bối cảnh vấn đề ban đầu.
Đưa ra những cân nhắc này,
this.f = {"instance:1": function instance1[]{},
"instance:2": function instance2[]{},
"instance:A": function instanceA[]{},
"instance:Z": function instanceZ[]{}
} [ "instance:" + a ]
Duy trì môi trường điện toán toàn cầu với ngữ nghĩa và cú pháp của ví dụ OP càng nhiều càng tốt.
Giả sử bạn đang viết một số chức năng bậc cao hơn trả về các chức năng khác. Trong trường hợp của tôi, đó là một tiện ích tạo ra một cái móc được đánh máy để tiêu thụ một số bối cảnh.
Tôi muốn để người tiêu dùng của tiện ích này có một thuộc tính
[{f:[function [] {}]}]
7 hợp lý trên hook được trả về, chứ không phải một số tên mã thư viện chung như [{f:[function [] {}]}]
8.Nỗ lực đầu tiên không hoạt động.
const someFunc = [] => { ... }
someFunc.name = someConfig.name
Nhập chế độ FullScreenen EXIT Mode FullScreen
Bạn nhận được một lỗi tốt ít nhất.
Vì vậy, sau đó tôi nghĩ cho bản thân mình 🤔 Tôi có biết gì về việc đặt tên năng động nói chung trong JavaScript không?
💡
Đối tượng có thể có các khóa động! Với dấu ngoặc vuông, chúng ta có thể xâu chuỗi các giá trị thời gian chạy.
{ [someVar]: "woohoo" }
Nhập chế độ FullScreenen EXIT Mode FullScreen
Vì vậy, để giải quyết vấn đề tên hàm có thể định cấu hình của tôi, tôi đã sử dụng các khóa tính toán để tạo một đối tượng và các khóa tính toán một lần nữa để phá hủy giá trị hàm.
🤯 Phải không?
const custom = "Jerome"
const { [custom]: someFunc } = { [custom]: [] => void 0 }
someFunc.name === "Jerome" // true
Nhập chế độ FullScreenen EXIT Mode FullScreen
^ Bạn có thể thử ví dụ đó trong bảng điều khiển trình duyệt của bạn.
Thứ khá gọn gàng! Đây là giải pháp cuối cùng của tôi, lấy cảm hứng từ sự gian lận này.
javascript: alert[
new function[a]{
this.f=eval["instance:"+a+"="+function[]{}]
}["A"] . toSource[]
];
alert[eval["instance:A"]];
0Nhập chế độ FullScreenen EXIT Mode FullScreen