如何在JavaScript函数体内引用当前正在执行的函数

3

我正在开发一个 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
2个回答

2

我不确定你是在寻找漏洞还是仅仅是为了学习。无论如何,你可以将其设置在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() {}
}


0
你可以在这里使用 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对象不同!


谢谢您的回答,但这实际上改变了原始代码。不幸的是,我只被允许添加新行。不允许编辑现有的代码... - Richard Hu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接