下面是代码片段的命名空间或闭包

时间:2013-12-17 14:38:37

标签: javascript namespaces closures difference

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

以下是命名空间:

 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)命名空间是一个(一个!)命名空间    或者命名空间也可能是一个名称空间,可以包含名称空间(比如文件夹可以有文件夹)?

3 个答案:

答案 0 :(得分:0)

  

命名空间和闭包是否相同

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

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

  

在上面提到的命名空间中:我是否可以访问'通过以下:

     

Interface.name()

  

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

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

  

命名空间是一个(一个!)命名空间还是名称空间也可能是一个名称空间,可以包含名称空间(比如文件夹可以有文件夹)?

对象可以具有指向其他对象的属性。那些对象可以做同样的事情。等等,就像你喜欢的那样深。可以将任何对象赋予函数作为属性值。

答案 1 :(得分:0)

  

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

这就是它。由于“namespace”不是JavaScript中存在的概念,因此我们使用对象模拟它们。闭包(返回一个对象)只是创建这样一个对象的一种方式。

  

2)在上面提到的命名空间中:我是否可以通过以下方式访问“function 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中的抽象概念,并且通常作为对象实现,因此它可以具有另一个嵌套的“命名空间”,只需将另一个对象作为其属性之一并将其称为命名空间。

答案 2 :(得分:0)

<强>你好

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

第一回答: 这就是它。由于“namespace”不是JavaScript中存在的概念,因此我们使用对象模拟它们。闭包(返回一个对象)只是创建这样一个对象的一种方式。

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

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

我现在理解它是否正确,假设我们有以下内容 上面的示例(加上var):

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

正确,错误,其他含义?

谢谢,Meru