【问题标题】:Is following snippet of code a namespace or closure下面的代码片段是命名空间还是闭包
【发布时间】:2014-01-05 09:12:24
【问题描述】:

我知道这里已经有很多关于命名空间的话题。我也读了很多。我仍然有点不确定,而是对命名空间和闭包有点搞砸了。 我还为我的线程带来了一些特定的代码。

以下是命名空间:

 var Interface = (function(){
     return {
         name: value,
         name: function( ... ) {
         }
     }; })();


//interface.call(); >> to call the namespace (I did not get where yet, but this is another story I think)

还有:

var Interface = (function(){
     function a(){
     }
     return {
         name: a
     }; })();

好的,阅读了许多主题和网站,我注意到的第一件事是: - Javascript 中没有命名空间,由于某些原因,它们被跳过了。 - 关闭似乎几乎相同,至少,我仍然缺乏了解差异的知识。例如,这是一个应该是闭包的函数:

var Counter = (function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  }   
})();

问题:

1) 命名空间和闭包是否相同,并且可能只是处于不同的“定义”级别,例如: 闭包(“方法”)是如何在 Javascript 中实现命名空间(一个概念)?

2) 在上述命名空间中:我可以通过以下方式访问function a 吗?

Interface.name()

3) 如果有一个带参数的函数,这个命名空间将如何工作?

 var Interface = (function(){
     function a(p1, p2){
     }
     return {
         name: a
     }; })();

这怎么叫? (注意我插入了p1p2)。

4) 命名空间是(一个!)命名空间吗 或者命名空间也可能是一个可以包含命名空间的命名空间(就像文件夹可以有文件夹一样)?

【问题讨论】:

    标签: javascript namespaces closures difference


    【解决方案1】:

    命名空间和闭包是一样的

    没有。命名空间是模糊定义的术语,用于“将您所做的一切作为分配给单个全局变量的对象的属性”。

    闭包是一种包装一些变量的方法,因此它们只能被特定的函数(或一组函数)访问。

    在上述命名空间中:我是否可以通过以下方式访问“功能 a”:

    Interface.name()

    是的

    如果有一个带参数的函数,这个命名空间将如何工作?

    与任何其他功能相同。如果要传递参数,请在调用时将它们放在() 之间。

    命名空间是(一个!)命名空间还是命名空间可能也是可以包含命名空间的命名空间(就像文件夹可以有文件夹一样)?

    一个对象可以具有指向其他对象的属性。这些对象可以做同样的事情。等等,只要你喜欢。任何对象都可以被赋予一个函数作为属性值。

    【讨论】:

      【解决方案2】:

      1) 命名空间和闭包是否相同,并且可能只是在“定义”的不同级别,例如:闭包(“方法”)是如何在 Javascript 中实现命名空间(一个概念)的?

      差不多就是这样。由于“命名空间”不是 JavaScript 中存在的概念,我们用对象来模拟它们。闭包(返回一个对象)只是创建此类对象的一种方式。

      2) 在上述命名空间中:我是否可以通过以下方式访问“功能 a”:Interface.name()

      是的,因为nameInterface 对象的一个​​属性,它被赋值为函数a

      3) 如果有一个带参数的函数,这个命名空间将如何工作?

      像这样:

      var Interface = (function(){
          return {
              name: function(p1, p2) {
              }
          }; 
      })();
      

      或者这个:

      var Interface = (function(){
          function name(p1, p2) {
          }
          return {
              name: name
          }; 
      })();
      

      这怎么叫? (注意我插入了 p1 和 p2)。

      像这样:

      Interface.name(123, 'abc');
      

      4) 命名空间是(一个!)命名空间还是命名空间也可能是可以包含命名空间的命名空间(就像文件夹可以有文件夹一样)?

      由于“命名空间”在 JavaScript 中只是一个抽象概念,并且通常以对象的形式实现,因此它可以有另一个嵌套的“命名空间”,只需将另一个对象作为其属性之一,就可以将其称为命名空间。

      【讨论】:

      • 非常感谢,这有帮助。我注意到我的假设并没有那么错误:)。您提到过,该名称空间只是一个“概念”-是的;闭包也只是一个概念,还是叫不同?
      • @Meru,我认为闭包更具体,它们在 JavaScript 中具有明确的含义(就像其他语言中的命名空间一样),您可以找到该术语的 definitions
      【解决方案3】:

      你好

      首先感谢您的回答。但实际上,当我阅读它们时,答案与“命名空间和闭包是否相同”的问题完全相反。

      第一个答案: 差不多就是这样。由于“命名空间”不是 JavaScript 中存在的概念,我们用对象来模拟它们。闭包(返回一个对象)只是创建此类对象的一种方式。

      第二: 不。命名空间是模糊定义的术语,用于“将您所做的一切作为分配给单个全局变量的对象的属性”。 闭包是一种包装一些变量的方法,因此它们只能被特定的函数(或函数集)访问。

      结论: 命名空间在 Javascript 中不存在,但让我们定义我们在 javascript 中也有它 假设这一点,我可以使用闭包(包装变量,以便特定函数可以访问它们)来实现命名空间。而命名空间将是“特定功能”。

      我现在理解是否正确,假设我们有以下 上面的例子(加上一个 var):

      var Interface = (function(){
          var someVar = "";
          function name(p1, p2) {
          }
          return {
              name: name,
             value: function() {
                     return someVar;
           }
          }; 
      })();
      
      • 这是一个闭包,包含“someVar”和“name”。
      • 闭包分配给变量“接口”。
      • “接口”是命名空间。它可以通过编写'Interface.call()'来“激活”

      正确,错误,还有其他含义吗?

      谢谢,梅鲁

      【讨论】:

      • 我认为昆汀和我只是以两种不同的方式解释了您的第一个问题。如果你 only 询问“命名空间和闭包是否相同”(他引用的部分),那么答案将是“否”。但是,考虑到那句话的其余部分,我认为您的理解是正确的。
      • 但请记住,您可以编写类似Foo = { doStuff: function() { ... } } 的内容并将 Foo 称为命名空间,即使在创建命名空间对象时不涉及任何闭包。命名空间的重要之处在于它通过将相似的东西保持在同一个“位置”来组织类似的东西,并且它使东西远离全局范围。在 JS 中,我们为此使用对象。我认为,您用于创建这些对象的语法并不像它们所服务的目的那么重要。
      • @Dagg:感谢您再次介入此威胁:)。我认为我正在以一种很好的方式来理解它。对于您的第一条评论,我是否假设正确,即:命名空间和闭包是否相同,并且可能只是在“定义”的不同级别,例如:闭包(“方法”)是命名空间(一个概念)是如何实现的Javascript? - 是的,所以命名空间是通过闭包实现的(作为一种选择)?
      • 唯一的问题是“命名空间和闭包是否相同”确实不正确,但其余的都很好。这有点像问“函数声明是否与函数对象相同”或“汽车是否与汽车工厂相同”。显然它们是相关的,但它们不是一回事。
      • 是的,我认为这两个东西不一样。我认为这是要求它弄清楚的最好方法。我只是想为一个项目创建我的第一个,但已经卡住了所有应该在那里的东西。嗯,也许这将是另一个威胁。感谢您的回答!
      猜你喜欢
      • 2012-09-25
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2019-02-22
      • 1970-01-01
      • 2011-08-01
      相关资源
      最近更新 更多