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

Javascript-命名空间和闭包之间的区别?,javascript,namespaces,closures,terminology,definition,Javascript,Namespaces,Closures,Terminology,Definition,在Javascript中,名称空间和闭包之间有什么区别?他们看起来很像我 编辑 具体来说,讨论名称空间和闭包,并有如下语句 现在,我们仍然会遇到需要声明的情况 自然不适合命名空间对象的变量 结构。但我们不希望这些变量具有全局范围。这就是 自调用函数应运而生 它接着给出了一个看起来很像闭包的“对象名称空间”。在我看来,名称空间是一个…但可能不是。。。?帮助?名称空间通常是一种将所有全局变量作为属性放在一个主全局变量下的方法,因此只添加一个新的真正顶级全局变量。它防止了对全局名称空间的污染,并减少了

在Javascript中,名称空间和闭包之间有什么区别?他们看起来很像我

编辑

具体来说,讨论名称空间和闭包,并有如下语句

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


它接着给出了一个看起来很像闭包的“对象名称空间”。在我看来,名称空间是一个…但可能不是。。。?帮助?

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

名称空间的示例:

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);
}

名称空间本质上是一个
对象
,没有任何有趣的属性,因此不会有一堆具有相似和/或冲突名称的变量在您的范围内运行。比如说

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
上方的“closes”的内部匿名函数的作用域,所以即使
x
超出了作用域,它也有一个对它的引用

值得注意的是,如果我随后执行
d=makeCounter()
d()
将从0开始计数。这是因为
c
d
从以下位置获取
x
的不同实例:

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


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

详细说明“名称空间”的定义。Javascript没有名称空间。这个术语是什么意思?在javascript中没有“名称空间”的唯一含义,因为有很多方法可以完成将符号分隔为空间的任务(包括使用闭包)。显示一些代码。这是一个非常好的答案-谢谢!我终于理解了闭包(我已经尝试了2-3个教程,但总是放弃了)是的,这是我见过的闭包最简洁、最有用的解释-谢谢!现在我明白了。我觉得这是关于闭包的一个很好的答案,但我仍然不清楚为什么它们不同于名称空间。您从哪里得到名称空间的定义,它非常具体,我对名称空间的印象只是一个命名上下文,其中没有两个对象可以具有相同的名称。在我看来,这意味着闭包是一种名称空间。欢迎来到SO,@GeoffreyHing!谢谢你的帮助,但在我看来,“闭包”一段过于复杂和混乱……但是名称空间的解释是清晰和简洁的,+1。