gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:36:38 26 4
gpt4 key购买 nike

我正在开发 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 也可能在严格模式下失败。所以这对我来说不是一个选择。有什么有效的方法可以完成这个任务吗?或者实际上不可能做到?

最佳答案

我不确定您是在寻找漏洞,还是只是学习练习。在任何情况下,您都可以将其设置为 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() {}
}

关于javascript - 如何在 JavaScript 中引用函数体内当前正在执行的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70786250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com