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

les*_*ang 8 javascript closures ecmascript-5

我知道JavaScript中的每个函数都是一个第一类对象,它有一个内部属性[[scope]],它承载函数自由变量的绑定记录.但是,有两种特殊情况.

  1. Function构造函数创建的函数也是一个闭包吗?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.
    
    Run Code Online (Sandbox Code Playgroud)

    这是不直观的.这也叫封闭吗?

  2. 如果内部函数没有任何自由变量,我们可以说在创建内部函数时会形成闭包吗?例如,

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

    在这种情况下,fn指的是作为内部函数创建的空函数对象.它没有自由变量.在这种情况下我们可以说闭合形成了吗?

Ber*_*rgi 9

Function构造函数创建的函数也是一个闭包吗?

是的,它关闭了全球范围.这可能是不直观的,因为所有其他JavaScript闭包都关闭了它们的词法范围,但它仍然匹配我们对闭包定义.在您的示例中,a是一个自由变量,并a在某处调用inner/ fnfunction 时解析为其他范围.

如果内部函数没有任何自由变量,我们仍然可以将其称为闭包吗?

取决于你问谁.有人说是的,其他人称他们为"无趣的封闭",我个人说不,因为他们没有提到外部范围.


Mrl*_*obo 5

注意:使用Function构造函数创建的函数不会创建其创建上下文的闭包。它们总是在全局范围内创建。运行它们时,它们将只能访问自己的局部变量和全局变量,而不能访问调用Function构造函数的作用域中的局部变量和全局变量。这与对函数表达式使用带有代码的eval不同。

来自https://developer.mozilla.org