JSFiddle中的变量范围行为

时间:2013-08-02 19:43:56

标签: javascript function global-variables eval

我有以下两个小脚本:

脚本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

1 个答案:

答案 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处理程序中,从而迫使您超出全局范围。