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

Javascript - difference between namespace vs. closure?

本文关键字:之间 区别 闭包 命名空间 Javascript      更新时间:2023-09-26

在Javascript中,命名空间和闭包有什么区别? 他们似乎与我非常相似。

编辑

具体来说,本文讨论了命名空间和闭包,并有这样的句子

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

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

命名空间本质上是一个没有有趣属性的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实例。

命名空间

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

命名空间的示例:

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

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

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

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