7

我知道这一点,eval并且setTimeout都可以接受一个字符串作为 (1 st) 参数,而且我知道我最好不要使用它。我只是好奇为什么会有区别:

!function() {
    var foo = 123;
    eval("alert(foo)");
}();

!function() {
    var foo = 123;
    setTimeout("alert(foo)", 0);
}();

第一个会起作用,第二个会出错:foo is not defined

他们是如何在幕后被处决的?

4

5 回答 5

6

请参阅MDN 上的参考资料setTimeout

字符串文字在全局上下文中进行评估,因此当字符串被评估为代码时,调用 setTimeout() 的上下文中的局部符号将不可用。

相反,传递给eval()的字符串文字是在调用 eval 的上下文中执行的。

于 2012-07-27T08:59:13.323 回答
2

setTimeouteval额外在全局范围内执行,因此它不知道foo.

这是备份它的参考:

字符串文字在全局上下文中进行评估,因此当字符串被评估为代码时,调用 setTimeout() 的上下文中的局部符号将不可用。

于 2012-07-27T08:58:18.303 回答
1

setTimeout 接受的参数比函数引用和超时更多。在超时后输入的任何内容都将作为参数传递给您的函数。

setTimeout(myFunction(param1, param2), 0, param1, param2);
于 2013-05-17T13:24:52.673 回答
0
!function() {
    var foo = 123;
    eval("alert(foo)");
}();

执行此代码时,javascript 会假装第 3 行显示“alert(foo)”。Foo 是在函数的范围内定义的。

!function() {
    var foo = 123;
    setTimeout("alert(foo)", 0);
}();

执行这段代码时,javascript会进入一个新函数;即function() {alert(foo)}. 在那个“新”功能的范围内,foo没有定义。

于 2012-07-27T08:59:25.573 回答
0

作为正确答案的补充,这里有一个调用,eval它会给你同样的行为,在这种情况下会出错:

!function() {
    var foo = 123;
    window.eval("alert(foo)"); // <- note the window.eval, this is important and changes the behavior of the `eval` function
}();

!function() {
    var foo = 123;
    setTimeout("alert(foo)", 0);
}();

这篇博文深入探讨了不同类型的eval: http: //perfectkills.com/global-eval-what-are-the-options/

于 2017-09-21T22:38:05.243 回答