我了解如何eval()
在非严格的环境下工作,但eval()
严格模式下的使用情况完全困扰着我。当eval()
在全局范围内直接调用时,变量将保留在新eval()
范围内:
'use strict';
eval('var a = 1;');
console.log(a); // ReferenceError: a is not defined
但是,如果我在全局范围内执行一个间接调用eval()
(应该是同样的事情,对吧?),它的行为好像不是严格模式:
'use strict';
(0, eval)('var a = 1;'); // indirect call to eval
console.log(a); // 1???
至少根据我对如何eval()
在严格模式下工作的理解,它意味着(无论eval()
是直接还是间接调用)为eval()
调用中定义的变量创建新范围,但这似乎不是这里的情况。该规范说明如下:
10.4.2输入评估代码 当控制进入eval代码的执行上下文时,执行以下步骤:
发布于 2018-05-14 16:03:16
你可以在以下方面看到这一点:
(function(){ "use strict"
var x = eval;
x("var y = 10"); // look at me all indirect
window.y;// 10
eval("var y = 11");
window.y;// still 10, direct call in strict mode gets a new context
})();
这个问题可以看出:
如果eval代码是严格代码,那么(我:修复上下文)
但严格的eval代码被定义为:
如果以包含使用严格指令的指令序言开始,或者eval的调用是直接呼叫,则评估代码是严格的评估代码。
由于调用不是直接的,因此eval代码不是严格的eval代码 - 执行在全局范围内。
首先是一个很好的问题。
“评估代码”比直接或间接调用更为通用eval
。
让我们来看看确切规格的eval
功能:
15.1.2.1 eval(x) 当使用一个参数x调用eval函数时,将执行以下步骤:
https://stackoverflow.com/questions/-100008464
复制相似问题