我有以下两个小脚本:
脚本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
是什么给出的?无论传递的字符串是var local = 3
还是local = 3
,eval都应该将local放在全局命名空间中吗?如果是这种情况,Function(...)
不应该在第二种情况下发现本地的类型是数字而不是未定义?
编辑1:
我在JSFiddle中运行了两个脚本,这些都是我得到的结果。但是,当我在JSFiddle之外运行它们时,预期结果会出现在两个输出都是:
的情况下number
number
答案 0 :(得分:2)
来自MDN:
使用
Function
构造函数创建的函数不会为其创建上下文创建闭包;它们总是在窗口上下文中运行(除非函数体以“use strict”;语句开头,在这种情况下,上下文是未定义的。)
就规范而言,这是因为15.3.2.1的第11步(强调我的):
返回一个按照13.2中的规定创建的新Function对象,将P作为FormalParameterListopt和body传递给FunctionBody。 在全局环境中传递作为Scope参数,并将严格传递为Strict标志。
因此,您的脚本2在本地范围内创建变量(which I'm assuming is not global,或者输出将不同 1 ),console.log
由{Function
评估1}}看不到它。
1 正如您的评论所证实,您在jsfiddle中运行测试,默认情况下将您的代码包装在window.onload处理程序中,从而迫使您超出全局范围。