Javascript - 命名空间与闭包之间的区别?

Ben*_*Ben 8 javascript closures namespaces terminology definition

在Javascript中,命名空间和闭包之间有什么区别?它们看起来和我很相似.

编辑

具体来说,本文讨论命名空间和闭包,并有句话

现在,我们仍然会遇到一些情况,我们想要声明自然不适合命名空间对象结构的变量.但我们不希望这些变量具有全局范围.这是自我调用函数的用武之地.

它继续给出看起来很像闭包的东西,作为"对象命名空间".它看起来像命名空间是一个封闭 ......但也许它不是......?救命?

Ven*_*nge 24

命名空间本质上是Object没有任何有趣的属性,你可以把东西塞进去,所以你没有在你的范围内运行类似和/或冲突名称的一堆变量.所以,例如,像

MyNS = {}
MyNS.x = 2
MyNS.func = function() { return 7; }
Run Code Online (Sandbox Code Playgroud)

闭包是指函数"保留"未在其中定义的变量的值,即使这些变量超出了范围.请考虑以下事项:

function makeCounter() { 
   var x = 0;
   return function() { return x++; }
}
Run Code Online (Sandbox Code Playgroud)

如果我让c = makeCounter(),然后反复打电话c(),我会得到0, 1, 2, 3, ....这是因为内部匿名函数的范围makeCounter定义了"关闭" x,所以即使x超出范围,它也会引用它.

值得注意的是,如果我这样做d = makeCounter(),d()将从0开始计数.这是因为cd得到不同的实例x.


jfr*_*d00 5

命名空间通常是一种将所有全局变量作为属性放在一个主全局变量下的方法,因此只添加一个新的真正顶级全局变量.它可以防止污染全局命名空间并减少与其他全局变量冲突的可能性.

以及命名空间的示例:

var YUI = {};
YUI.one = function(sel) {...};
YUI.two = function(sel) {...};
YUI.three = function(sel) {...};
Run Code Online (Sandbox Code Playgroud)

顶级全局命名空间中有一个新项YUI,但是通过YUI命名空间对象有多个全局可访问的项.

闭包是一个功能块,由于对函数内部部分的持久引用,它超出了函数执行的正常结束.

function doSometing() {
    var x = 10;
    setTimer(function() {
        // this gets called after doSomething() has finished executing
        // but because of the function closure, the variables 
        // inside of the parent scope like x are still accessible
        x += 10;
    }, 1000);
}
Run Code Online (Sandbox Code Playgroud)