JavaScript Internals 101:功能和功能

时间:2012-11-26 08:11:26

标签: javascript

>>> function () {}
SyntaxError

>>> f = function() {}
f = function() {}

>>> new function() {}
>>> Object

>>> new Function()
function anonymous() {}

>>> Function()
function anonymous() {}


>>> f = (function() { a = 10; return function() {console.log(a);} })();
>>> f()
10
undefined

>>> f = (function() { a = 10; return new Function('console.log(a)'); })();
>>> f()
undefined

因此,我有两个问题:

  1. 为什么即使没有Function运算符,new构造函数也会返回一个新函数?

  2. 是否使用Function构造函数创建函数NOT闭包?

3 个答案:

答案 0 :(得分:7)

  

为什么即使没有new运算符,Function构造函数也会返回一个新函数?

Calling Function() is the same as calling new Function()

  

Function作为函数而不是构造函数调用时,它会创建并初始化一个新的Function对象。因此,函数调用Function(…)等同于具有相同参数的对象创建表达式new Function(…)


  

是否使用Function构造函数NOT闭包创建函数?

是的,函数的范围设置为全局环境,而不是词法环境的范围。见http://es5.github.com/#x15.3.2.1,第11步:

  

11。返回按照13.2中的指定创建的新Function对象,将 P 作为 FormalParameterList body 作为 FunctionBody 传递。将全局环境作为 Scope 参数传递,将 strict 作为 Strict 标记传递。

这意味着使用Function构造函数就好像你在全局范围内声明了一个函数,关于它可以访问的范围(不关于函数可见的位置)。

这与使用函数声明/表达式不同,其中作用域基于当前的exectution上下文(http://es5.github.com/#x13):

  
      
  1. funcEnv 成为调用NewDeclarativeEnvironment传递正在运行的执行上下文的词汇环境作为参数的结果
  2.   

答案 1 :(得分:1)

Function是用于实现function的对象,它们在语义上是相同的底层对象。

但是,function与它们所属的脚本同时被解析,而Function正文在实例化时被解析,这可以解释为什么你会从你的行为中得到不同的行为js口译员。

有关详细信息,请参阅there

答案 2 :(得分:0)

1,函数可以返回对象,因此Function()返回一个是荒谬的。如果您想使用它,我会仔细检查文档,因为它可能不适用于所有浏览器。

2,正确。