JavaScript Internals 101:功能和功能

tre*_*der 1 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
Run Code Online (Sandbox Code Playgroud)

因此,我有两个问题:

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

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

Fel*_*ing 7

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

呼叫Function()与呼叫相同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传递.传入Global Environment作为Scope参数,严格作为Strict标志.

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

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

  1. funcEnv成为调用NewDeclarativeEnvironment传递正在运行的执行上下文的Lexical Environment作为参数的结果