gpt4 book ai didi

javascript - 与 JavaScript 作用域链交互

转载 作者:行者123 更新时间:2023-11-29 10:25:41 26 4
gpt4 key购买 nike

给定范围内的以下 javascript 片段:

var x = 10;

function sayx() {
alert(x);
}

sayx();

您当然会期望消息框打印“10”,您可以进行多个函数嵌套来与“x”的确定方式进行交互,因为在解析 x 是什么时,环境会沿着作用域链向上移动。

您甚至可以使用 eval 进行一定程度的“重新编译”,以在运行时注入(inject)新的作用域。例如:

var x = 10;

function sayx() {
alert(x);
}

function wrap(f) {
return eval('(function() { var x = 20;(' + f + ')(); })');
}

wrap(sayx)();

这是有效的,因为该函数将调用其 toString 函数,该函数将返回“原始”源。因此我们实际上创建了一个包装版本的函数,它具有一个覆盖 x 的新范围。结果将是一个警报打印“20”而不是“10”的框。

但是,从表面上看,这似乎可行,但作用域链被破坏了,链中的下一项不再相同,因为函数“f”现在定义在不同的位置。更糟糕的是它继承的范围链可能包含许多调用函数不应访问的引用。

那么,是否有更受支持、更可行的方法来注入(inject)范围项?像这样的东西:

function withScope(f, scope) { ??? }

---

var x = 10, y = 10;

function dothemath() {
alert(x + y);
}

var haxthemath = withScope(dothemath, { x: 9000 });
haxthemath(); // 9010 not 20

我猜答案是否定的,有些人可能会争辩说这种范围注入(inject)存在“安全”问题,但考虑到你无论如何都可以做到这一点(尽管严重破坏)我不认为它是..

这样做的好处是您基本上可以伪造自己的伪变量。

提前致谢。


编辑,稍微澄清一下,假设我想“withScope”一个具有以下作用域链的函数:

Window - window properties
Object - { var x = 10 }
Object - { var y = 5 + x }

我希望能够取回一个有效地具有相同链 + 我提供的作用域的函数。即:

withScope(somefunc, { foo: 'bar' })

会给我

Window - window properties
Object - { var x = 10 }
Object - { var y = 5 + x }
Ext scope - { foo = 'bar' }

将找到所有先前的常设变量,因为我的扩展范围没有说明它们。

最佳答案

如果您按作用域引用函数和/或闭包中的局部变量,我认为答案是否定的。

您可以使用 functionName.call(scope, arg1, ...) 或 functionName.apply(scope, [arg1, ...]) 更改 this 关键字的范围;这可以与原型(prototype)一起使用来创建您所描述的类似链 - 如果在对象自身的属性中找不到某些内容,则会在其原型(prototype)中查找。如果该属性不存在,则使用链中的下一个原型(prototype),依此类推。

关于javascript - 与 JavaScript 作用域链交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1810931/

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