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?

    下一篇: Is a function return necessary to be called a Closure