2

以下需要在函数范围内,因为不会发生奇怪的行为是交互式控制台模式。

以下函数按预期返回 5

(function() { var x = 5; return eval("x"); })()

一个简单的透明(ish)更改:

(function() { var x = 5; var j = eval; return j("x"); })()

产生错误:

ReferenceError: x is not defined

这是某种奇怪的安全措施吗?

4

1 回答 1

6

您的第二个示例是间接调用eval. 间接调用eval在全局范围内进行评估,其中x不可见:

var x = 10;

// This will return 10
(function() { 
    var x = 5; 
    var j = eval; 
    return j("x");
})();

// This will return 5
(function() { 
    var x = 5; 
    return eval("x");
})();

规格

 1. ...如果没有通过直接调用 eval 函数来评估 eval 代码,那么

     一种。初始化执行上下文,就好像它是一个全局执行上下文...

于 2013-04-04T12:16:55.073 回答