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

时间:2012-04-27 03:31:45

标签: javascript namespaces closures terminology definition

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

修改

具体来说,this article讨论了名称空间和闭包,并且有

之类的句子
  

现在,我们仍然会遇到需要申报的情况   不自然地适合命名空间对象的变量   结构体。但我们不希望这些变量具有全局范围。这是哪里   自我调用功能进来。

它继续提供看起来很像闭包的东西,作为“对象命名空间”。它看起来像命名空间IS closure ...但也许它不是......?帮助

3 个答案:

答案 0 :(得分:23)

命名空间本质上是一个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定义的内部匿名函数的范围“关闭”x,因此即使x超出范围,它也会引用它。

值得注意的是,如果我执行d = makeCounter()d()将从0开始计算。这是因为cd获得x的不同实例。

答案 1 :(得分: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);
}

答案 2 :(得分:2)

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

  

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

命名空间只是一种约定,为避免变量使全局范围混乱而创建的对象。