gpt4 book ai didi

javascript - 具有返回值的全局评估?

转载 作者:搜寻专家 更新时间:2023-11-01 04:18:00 26 4
gpt4 key购买 nike

经过一段时间的搜索,我希望找到一个有返回值的全局eval的解决方案。

  • eval 将在当前范围内运行
  • Function constructor 将在其自己的本地范围内执行并访问全局范围
  • setTimeout 技巧是一个异步操作
  • 脚本注入(inject)无法返回值
  • window.execScript 同样 - 无法返回值

所以我的问题是:

是否有任何其他技术可以在全局范围内运行并可以返回值?

(示例将不胜感激)。

最佳答案

您可以让 eval 在全局范围内运行,而不是

eval(s)

就用

window.eval(s);

var e=eval; e(s);

[eval][0](s)

这令人惊讶地发生了,因为 Javascript 很奇怪并且有一个关于 eval 的特殊规则:当你直接使用原始的 eval 对象来评估一个字符串时,评估发生在当前上下文。

如果使用“间接评估”代替(即您将 eval 存储在一个变量中然后使用该变量,或者即使您使用 访问 eval >window 对象)评估发生在全局上下文中。

您可以在 Javascript 控制台中检查:

function foo() {
eval("function square(x){ return x*x; }");
}

function bar() {
window.eval("function square(x){ return x*x; }");
}

foo()

square(12) // <-- this gives an error; direct evaluation was used

bar()

square(12) // <-- this returns 144

因此 window.eval(s)eval(s) 不同,即使 window.eval === eval 也是如此。

附言

请注意,eval 有一个特殊的特定语言规则来实现这一点,但在其他情况下也可以出于不同的原因观察到同样明显奇怪的行为。

如果你有一个对象 x 并且定义了一个方法 m 那么

x.m()

不一样

var mm = x.m; mm();

因为 this 在第一种情况下会在 m 中的代码执行期间绑定(bind)到 x 而在第二种情况下 this 将是全局对象。

所以在这种情况下,即使 x.m === mmx.m() 也不同于 mm()

出于同样的原因,x.m()[x.m][0]() 不同,因为在后者中,this 将在方法代码执行期间绑定(bind)到数组对象,而不是绑定(bind)到 x

关于javascript - 具有返回值的全局评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19583308/

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