8

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

编辑

具体来说,这篇文章讨论了命名空间和闭包,并且有类似的句子

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

它继续给出看起来很像闭包的东西,作为“对象命名空间”。在我看来,命名空间是一个闭包……但也许不是……?帮助?

4

3 回答 3

24

命名空间本质上是一个Object没有有趣的属性,您可以将内容塞入其中,因此您的范围内不会有一堆名称相似和/或冲突的变量。所以,例如,像

MyNS = {}
MyNS.x = 2
MyNS.func = function() { return 7; }

闭包是指函数“保留”未在其中定义的变量的值,即使这些变量已经超出范围。采取以下措施:

function makeCounter() { 
   var x = 0;
   return function() { return x++; }
}

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

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

于 2012-04-27T03:38:41.353 回答
5

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

以及命名空间的示例:

var YUI = {};
YUI.one = function(sel) {...};
YUI.two = function(sel) {...};
YUI.three = function(sel) {...};

顶级全局命名空间中有一个新项目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);
}
于 2012-04-27T03:38:12.930 回答
2

来自http://jibbering.com/faq/notes/closures/

闭包是通过从该函数调用返回在函数调用的执行上下文中创建的函数对象并将对该内部函数的引用分配给另一个对象的属性而形成的。或者通过直接将对此类函数对象的引用分配给例如全局变量、全局可访问对象的属性或通过引用作为参数传递给外部函数调用的对象。

命名空间只是一种约定,创建的对象是为了避免将全局范围与变量混淆。

于 2012-04-27T03:41:29.180 回答