如何正确描述Javascript闭包

如何正确描述Javascript闭包,javascript,closures,Javascript,Closures,看看Javascript中的“单例”实现(我一直在玩的东西,如果我错了,请纠正我),到底是什么结束 据我在阅读关于作用域和闭包的“You't know JS”一书中所了解,正确的术语应该是:函数(或模块)M1在主作用域上具有闭包 为了描述这一点,我想说M1在主对象中创建了一个私有范围。这两个范围之间的概念边界被视为“闭合” 但在我看来,为了成为一个闭包(而不仅仅是一个具有私有作用域的函数),您需要一个在您要“关闭”的作用域内可访问的接口,该接口允许您访问私有作用域 i、 e.在我看来,你可以说闭

看看Javascript中的“单例”实现(我一直在玩的东西,如果我错了,请纠正我),到底是什么结束

据我在阅读关于作用域和闭包的“You't know JS”一书中所了解,正确的术语应该是:函数(或模块)M1在主作用域上具有闭包

为了描述这一点,我想说M1在主对象中创建了一个私有范围。这两个范围之间的概念边界被视为“闭合”

但在我看来,为了成为一个闭包(而不仅仅是一个具有私有作用域的函数),您需要一个在您要“关闭”的作用域内可访问的接口,该接口允许您访问私有作用域

i、 e.在我看来,你可以说闭包是通过使私有范围内的变量可用于相应的“公共”范围来定义的,即使在执行创建闭包的函数后控制权已返回到“公共”范围

以上是正确的吗

/**
 * Singleton object implementation
 */
var M1 = (function() {

    // Private variables
    var items = [];
    var x = 5;

    // Getters and setters
    var getX = function() {return x;};
    var getItems = function() {return items;};

    // Private functions
    var item = function(name) {
        this.name = name;
    };

    // Public interface
    return {
        getX: getX,
        getItems: getItems,
        createItem: function(name) {
            items.push(new item(name));
        }
    };
})();

我认为这可能属于codereview?是的,你的陈述是正确的,看看这个答案:,它说明和你说的一样,但换句话说。这个问题中公认的答案指的是封闭的私有变量。我以为是公共范围被私人范围关闭了。哪个更正确?@mplungjan这是一个寻求对原则的理解的问题,而不是无限制的批评。这里给出的代码是一个一般性/假设性的问题,这个问题在代码评审中是离题的。在“i.e.”后面的一段几乎是对它的总结。根据most,闭包是在创建函数的执行上下文时创建的。此时,它“关闭”外部执行上下文。然而,正是“特权”函数访问内部作用域的能力使闭包变得有趣。