以下需要在函数范围内,因为不会发生奇怪的行为是交互式控制台模式。
以下函数按预期返回5
(function() { var x = 5; return eval("x"); })()
简单透明(ish)更改:
(function() { var x = 5; var j = eval; return j("x"); })()
产生错误:
ReferenceError: x is not defined
这是一种奇怪的安全措施吗?
答案 0 :(得分: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");
})();
来自the spec:
1. ...如果未通过直接调用eval函数评估eval代码,则
a。初始化执行上下文,就好像它是一个全局执行上下文......