0

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

以下是一个命名空间:

 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)命名空间是(一个!)命名空间还是命名空间也可能是一个可以包含命名空间的命名空间(就像文件夹可以有文件夹一样)?

4

3 回答 3

0

命名空间和闭包是否相同

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

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

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

Interface.name()

是的

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

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

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

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

于 2013-12-17T14:43:53.783 回答
0

你好

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

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

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

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

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

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

正确,错误,其他含义?

谢谢,梅鲁

于 2013-12-18T13:57:27.397 回答
0

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

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

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

是的,因为它是对象name的一个​​属性Interface,并且它被赋予函数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 中的一个抽象概念,并且通常被实现为一个对象,因此它可以有另一个嵌套的“命名空间”,只需将另一个对象作为其属性之一,就可以将其称为命名空间。

于 2013-12-17T14:50:51.903 回答