【问题标题】:Javascript - difference between namespace vs. closure?Javascript - 命名空间与闭包之间的区别?
【发布时间】:2012-05-07 19:59:47
【问题描述】:

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

编辑

具体来说,this article 讨论了命名空间和闭包,并有类似

的句子

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

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

【问题讨论】:

  • 详细说明您对“命名空间”的定义。
  • Javascript 没有命名空间。这个词是什么意思?
  • javascript 中的“命名空间”没有单一含义,因为有很多方法可以完成将符号分隔为空格的任务(包括使用闭包)。显示一些代码。

标签: javascript namespaces closures terminology definition


【解决方案1】:

命名空间本质上是一个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 开始计数。这是因为 c 和 d 得到不同的 x 实例。

【讨论】:

  • 这是一个非常好的答案 - 谢谢!不过要给它一些时间:)
  • +1 我终于明白了闭包(我已经尝试了 2-3 个教程,但总是放弃)
  • 是的,这是我见过的对闭包的最简洁和有用的解释 - 谢谢!现在我明白了。
  • 我觉得这是一个关于闭包的好答案,但我仍然不清楚为什么它们与命名空间不同。您从哪里获得命名空间的定义,它非常具体,我对命名空间的印象只是一个命名上下文,其中没有两个对象可以具有相同的名称。在我看来,这意味着闭包是一种命名空间。
【解决方案2】:

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

命名空间示例:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 欢迎来到 SO,@GeoffreyHing!感谢您的帮助,但在我看来,“关闭”段落过于复杂且极其混乱......但命名空间解释清晰简洁,+1。
    猜你喜欢
    • 2016-05-28
    • 2020-08-21
    • 2012-08-12
    • 2020-10-21
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2019-09-13
    • 2018-06-23
    相关资源
    最近更新 更多