我知道这里有很多关于命名空间的线程。我也读了很多。我仍然有点不确定,而是对命名空间与闭包有点搞砸了。 我还带了一些特定的代码与我的线程。
以下是命名空间:
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
}; })();
怎么可以这个叫? (注意我插入了p1
和p2
)。
4)命名空间是一个(一个!)命名空间 或者命名空间也可能是一个名称空间,可以包含名称空间(比如文件夹可以有文件夹)?
答案 0 :(得分:0)
命名空间和闭包是否相同
没有。命名空间是模糊定义的术语,用于"将您执行的所有操作作为分配给单个全局变量的对象的属性"。
闭包是一种包装变量的方法,因此它们只能由特定的函数(或函数集)访问。
在上面提到的命名空间中:我是否可以访问'通过以下:
Interface.name()
是
如果有一个带参数的函数,这个命名空间如何工作?
与任何其他功能相同。如果您想传递参数,请在调用它时将它们放在(
和)
之间。
命名空间是一个(一个!)命名空间还是名称空间也可能是一个名称空间,可以包含名称空间(比如文件夹可以有文件夹)?
对象可以具有指向其他对象的属性。那些对象可以做同样的事情。等等,就像你喜欢的那样深。可以将任何对象赋予函数作为属性值。
答案 1 :(得分:0)
1)命名空间和闭包是否相同,可能只是在“定义”的不同层次上:闭包(“方法”)是如何在Javascript中实现命名空间(一个概念)?
这就是它。由于“namespace”不是JavaScript中存在的概念,因此我们使用对象模拟它们。闭包(返回一个对象)只是创建这样一个对象的一种方式。
2)在上面提到的命名空间中:我是否可以通过以下方式访问“function 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中的抽象概念,并且通常作为对象实现,因此它可以具有另一个嵌套的“命名空间”,只需将另一个对象作为其属性之一并将其称为命名空间。
答案 2 :(得分:0)
<强>你好强>
首先感谢您的答案。但实际上,当我阅读它们时,答案意味着与“命名空间和闭包是否相同”这一问题完全相反。
第一回答: 这就是它。由于“namespace”不是JavaScript中存在的概念,因此我们使用对象模拟它们。闭包(返回一个对象)只是创建这样一个对象的一种方式。
<强>第二强> 不可以。命名空间是模糊定义的术语,用于“将您所做的所有内容作为分配给单个全局变量的对象的属性”。 闭包是一种包装变量的方法,因此它们只能由特定的函数(或函数集)访问。
的结论:强> 的 Javascript中不存在命名空间,但是让我们在javascript中定义它 假设这样,我可以使用闭包(包装变量,以便它们可以被特定函数访问)来实现命名空间。而名称空间将是“特定功能”。
我现在理解它是否正确,假设我们有以下内容 上面的示例(加上var):
var Interface = (function(){
var someVar = "";
function name(p1, p2) {
}
return {
name: name,
value: function() {
return someVar;
}
};
})();
正确,错误,其他含义?
谢谢,Meru