0
>>> 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函数不是闭包吗?

4

3 回答 3

7

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

调用Function()与调用相同new Function()

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


使用 Function 构造函数创建的函数不是闭包吗?

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

11. 返回一个按照 13.2 中指定的方法创建的新 Function 对象,将P作为FormalParameterList并将body作为FunctionBody。将 Global Environment 作为Scope参数传入,并将strict作为Strict标志。

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

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

  1. funcEnv成为调用 NewDeclarativeEnvironment 的结果,传递运行执行上下文的词法环境作为参数
于 2012-11-26T08:17:20.413 回答
1

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

但是,afunction与它们所属的脚本同时Function被解析,而 body 是在实例化时解析的,这可以解释为什么你的 js 解释器的行为会有所不同。

看到那里了解更多信息。

于 2012-11-26T08:21:48.777 回答
0

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

2、正确。

于 2012-11-26T08:16:52.487 回答