我正在開發一個 JavaScript 代碼檢測工具。
給定一段代碼,假設我需要修改它以完成以下任務:
任務:在呼叫每個函式時為其分配一個新屬性,并從函式體內訪問該屬性。
而且我只被允許在原始代碼中添加新的代碼行。不允許進行其他更改,例如洗掉。
考慮以下示例
foo();
function foo() { // All functions are assumed to have names
}
我可以通過添加這樣的兩行代碼來修改它(基本上我通過參考函式名稱直接分配和訪問添加的屬性):
foo.prop = ...; // give foo a new property
foo();
function foo() {
console.log(foo.prop); // access the property
}
但是,如果內部宣告了另一個同名的函式foo,則上述解決方案不起作用。考慮以下示例。
foo();
function foo() { // All functions are assumed to have names
function foo() {...}
}
修改后:
foo.prop = ... // give foo a new property
foo();
function foo() {
console.log(foo.prop); // property does not exist!
function foo() {...}
}
由于函式提升,外部foo被內部覆寫foo,因此,我無法使用函式名稱訪問添加的屬性。
arguments.callee在嚴格模式下使用也可能失敗。所以這不是我的選擇。是否有任何有效的方法可以完成這項任務?還是實際上不可能做到?
uj5u.com熱心網友回復:
您可以在bind這里使用該功能:
function foo() {
console.log("outer", this.prop);
function foo() {
console.log("inner", this.prop)
}
foo();
}
const binded = foo.bind({prop: 2});
binded();
這會將函式中的 this 物件設定為特定值。請注意,內部 foo 函式中的 this 物件是不同的!
uj5u.com熱心網友回復:
我不確定您是在尋找漏洞還是這只是一個學習練習。在任何情況下,您都可以將其設定為Object.prototype,并且它將被foo(以及所有其他物件......包括函式)繼承。然后,您可以delete在完成后使用該屬性:
Object.defineProperty(Object.prototype, 'prop', {
configurable: true,
enumerable: true,
writable: true,
value: 'bar',
});
// invoke
foo(); // "bar"
const obj = {};
console.log('obj', obj.prop); // "obj" "bar"
obj.prop = 'baz';
console.log('obj', obj.prop); // "obj" "baz"
// "undefine" the prop
delete Object.prototype['prop'];
console.log('obj', obj.prop); // "obj" "baz"
// invoke again
foo(); // undefined
function foo() {
console.log(foo.prop);
function foo() {}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/416670.html
標籤:
