JavaScript中的每个函数都是封闭的吗?

我明白,JavaScript中的每个函数都是一个一级对象,并且它有一个内部属性[[scope]],它托pipe函数的自由variables的绑定logging。 但是,有两个特例。

  1. Function构造函数创build的函数是否也是闭包? 由Function构造函数创build的函数对象是特殊的,因为它的[[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. 

    这是不直观的。 这也被称为封闭?

  2. 如果一个内部函数没有任何自由variables,那么当内部函数被创build时,我们可以说是闭包吗? 例如,

     // This is a useless case only for academic study var fn = (function outer() { var localVar1 = 1, localVar2 = 2; return function() {}; })(); 

    在这种情况下,fn是指作为内部函数创build的空函数对象。 它没有自由variables。 在这种情况下,我们可以说封闭形成?

Function构造函数创build的函数是否也是闭包?

是的,它closures了全球范围。 这可能是不直观的,因为所有其他JavaScript闭包关于它们的词法范围,但它仍然符合我们对闭包的定义 。 在你的例子中, a是一个自由variables,当inner / fn函数在某处被调用时,parsing成另一个作用域中的a

如果一个内部函数没有任何自由variables,我们仍然可以称它为闭包吗?

取决于你问的对象。 有人说是的, 别人称他们为“无趣封闭”,我个人说“不”是因为他们没有引用外部范围。

注意:使用Function构造函数创build的函数不会为其创build上下文创build闭包; 他们总是在全球范围内创build。 运行它们时,它们只能访问自己的局部variables和全局variables,而不能调用函数构造函数的作用域。 这与使用eval和函数expression式的代码是不同的。

https://developer.mozilla.org