我有以下两个小脚本:
脚本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
什么东西?eval是否应该将local放在全局命名空间中,而不管传递的字符串是否具有var local = 3
或local = 3
?如果是这样的话,Function(...)
不应该在第二种情况下发现local的类型是数字而不是未定义的吗?
编辑1:
我在JSFiddle中运行了两个脚本,这些都是我得到的结果。然而,当我在JSFiddle之外运行它们时,当两个输出都是时,就会出现预期的结果
number
number
来自MDN:
使用
Function
构造函数创建的函数不会为其创建上下文创建闭包;它们总是在窗口上下文中运行(除非函数体以"use strict";语句开头,在这种情况下上下文是未定义的)。
就规范而言,这是因为15.3.2.1中的第11步(重点矿):
返回按照13.2中的规定创建的新Function对象,将p作为FormalParameterListopt,将body作为FunctionBody在全局环境中作为Scope参数传递并作为strict标志传递strict。
因此,Script 2在本地作用域中创建了一个变量(我假设它不是全局的,或者输出会不同1),而Function
评估的console.log
无法看到它。
1正如您的评论所证实的,您在jsfiddle中运行测试,默认情况下,它将您的代码封装在window.onload处理程序中,迫使您退出全局范围。