我正在开发一个 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
也可能失败。所以这不是我的选择。有没有有效的方法可以完成这个任务?或者说这是不可能的吗?
arguments.callee
似乎没有任何替代品。 - Akxe