>>> 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
因此,我有两个问题:
为什么即使没有Function
运算符,new
构造函数也会返回一个新函数?
是否使用Function
构造函数创建函数NOT闭包?
答案 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):
- 让 funcEnv 成为调用NewDeclarativeEnvironment传递正在运行的执行上下文的词汇环境作为参数的结果
醇>
答案 1 :(得分:1)
Function
是用于实现function
的对象,它们在语义上是相同的底层对象。
但是,function
与它们所属的脚本同时被解析,而Function
正文在实例化时被解析,这可以解释为什么你会从你的行为中得到不同的行为js口译员。
有关详细信息,请参阅there。
答案 2 :(得分:0)
1,函数可以返回对象,因此Function()
返回一个是荒谬的。如果您想使用它,我会仔细检查文档,因为它可能不适用于所有浏览器。
2,正确。