eval和setTimeout之间的差异执行字符串代码

won*_*ng2 6 javascript

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

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

!function() {
    var foo = 123;
    setTimeout("alert(foo)", 0);
}();
Run Code Online (Sandbox Code Playgroud)

第一个会起作用,第二个会产生错误: foo is not defined

他们如何在幕后执行?

Wol*_*ram 5

请参阅MDN参考资料setTimeout.

字符串文字在全局上下文中计算,因此当字符串作为代码计算时,调用setTimeout()的上下文中的局部符号将不可用.

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