JavaScript中的每个函数都是封闭的吗?
我明白,JavaScript中的每个函数都是第一类对象,并且它有一个内部属性[[scope]],它托管函数自由变量的绑定记录。 但是,有两种特殊情况。
函数构造函数创建的函数是否也是闭包? 由Function构造函数创建的函数对象是特殊的,因为它[[scope]]可能不会引用其外部函数的词法环境,而只能引用全局上下文。 例如,
var a = 1;
var fn = (function outer() {
var a = 2;
var inner = new Function('alert(a); ');
return inner;
})();
fn(); // will alert 1, not 2.
这是不直观的。 这也被称为封闭?
如果一个内部函数没有任何自由变量,那么当内部函数被创建时,我们能否说闭包被形成了? 例如,
// This is a useless case only for academic study
var fn = (function outer() {
var localVar1 = 1,
localVar2 = 2;
return function() {};
})();
在这种情况下,fn是指作为内部函数创建的空函数对象。 它没有自由变量。 在这种情况下,我们可以说封闭已经形成了吗?
函数构造函数创建的函数是否也是闭包?
是的,它在全球范围内关闭。 这可能是不直观的,因为所有其他的JavaScript关闭了它们的词法范围,但它仍然符合我们对闭包的定义。 在你的例子中, a
是一个自由变量,当inner
/ fn
函数在某处被调用时,它解析为另一个作用域中的a
。
如果一个内部函数没有任何自由变量,我们仍然可以称它为闭包吗?
取决于你问的对象。 有人说是的,其他人称他们为“无趣的关闭”,我个人说No,因为他们没有引用外部范围。
注意:使用Function构造函数创建的函数不会创建对其创建上下文的闭包; 他们总是在全球范围内创建。 运行它们时,它们只能访问它们自己的局部变量和全局变量,而不能访问函数构造函数调用的范围。 这与使用eval和函数表达式的代码不同。
来自https://developer.mozilla.org
链接地址: http://www.djcxy.com/p/52033.html上一篇: Is it true that every function in JavaScript is a closure?