2012-04-27 82 views
6

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

编辑

具体来说,this article讨论命名空间和封锁,并有像

句子现在,我们还是得情况下,我们会想声明 变量,唐自然适合命名空间对象 结构。但我们不希望这些变量具有全局范围。这是 自我调用函数进来的地方。

它继续给看起来很像闭包,作为“对象命名空间”。它看起来像我的名字空间是一个closure ...但也许它不是...?帮帮我?

+1

详细说明您对“命名空间”的定义。 – 2012-04-27 03:32:46

+0

Javascript没有名称空间。这个词是什么意思? – 2012-04-27 03:33:52

+1

在javascript中没有“名称空间”的含义,因为有很多方法可以完成将符号分隔为空格(包括关闭)的任务。显示一些代码。 – 2012-04-27 03:34:06

回答

23

命名空间本质上是一个Object与你推到的东西,所以你不要有类似的和/或在你的范围内运行冲突的名字一组变量没有有趣的性质。因此,举例来说,像

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

当一个函数“保留” A闭合的未在其定义的变量的值,即使这些变量已超出范围。看看下面:

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不同实例。

+0

这是一个非常好的答案 - 谢谢!会给它一些时间虽然:) – Ben 2012-04-27 03:44:26

+0

+1我终于明白关闭(我已经尝试了2-3个教程,总是放弃) – ajax333221 2012-04-27 03:46:43

+0

是的,这是最简洁和有用的解释我已经看到封闭 - 谢谢!现在我懂了。 – iono 2012-08-11 12:13:19

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

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

的封闭通过返回一个从该函数调用的函数调用的执行上下文中创建的功能对象和另一个的属性分配给该内部函数的参考形成目的。或者,通过直接将对这样的函数对象的引用分配给例如全局变量,全局可访问对象的属性或通过引用传递的对象作为外部函数调用的参数。

命名空间只是一个约定,创建的对象可避免使用变量混淆全局范围。

+0

欢迎来到SO,@GeoffreyHing!感谢您的帮助,但在我看来,“关闭”段落过于复杂且非常混乱......但名称空间解释清晰简洁,+1。 – Ben 2012-04-27 03:50:15