1

我有以下两个小脚本:

脚本 1:

eval("local = 3;");
console.log(typeof local);
Function("console.log(typeof local);")();

输出:

number
number

脚本 2:

eval("var local = 3;");
console.log(typeof local);
Function("console.log(typeof local);")();

输出:

number
undefined

是什么赋予了?无论传递的字符串是 avar local = 3还是 a , eval 是否应该将 local 放在全局命名空间中local = 3?如果是这种情况,Function(...)在第二种情况下不应该发现本地的类型是数字而不是未定义吗?

编辑1:

我在 JSFiddle 中运行了这两个脚本,这就是我得到的结果。但是,当我在 JSFiddle 之外运行它们时,预期的结果会出现在两个输出为:

number 
number
4

1 回答 1

2

来自MDN

使用构造函数创建的Function函数不会为其创建上下文创建闭包;它们总是在窗口上下文中运行(除非函数体以“use strict”; 语句开头,在这种情况下上下文未定义)。

就规范而言,这是因为15.3.2.1中的第 11 步(强调我的):

返回按照 13.2 中指定的方式创建的新 Function 对象,将 P 作为 FormalParameterListopt 并将 body 作为 FunctionBody。将 Global Environment 作为 Scope 参数传入,并将 strict 作为 Strict 标志。

因此,您的 Script 2 在本地范围内创建了一个变量(我假设它不是 global,否则输出将不同1),并且console.logeval'd byFunction看不到它。


1正如您的评论所证实的那样,您在 jsfiddle 中运行测试,默认情况下它将您的代码包装在 window.onload 处理程序中,从而迫使您脱离全局范围。

于 2013-08-02T19:52:38.967 回答