我正在阅读“学习Javascript设计模式”一书,我遇到了一个我无法完全理解的特点。查看以下代码段:
var myNamespace = (function () {
var myPrivateVar, myPrivateMethod;
// A private counter variable
myPrivateVar = 0;
// A private function which logs any arguments
myPrivateMethod = function( foo ) {
console.log( foo );
};
return {
// A public variable
myPublicVar: "foo",
// A public function utilizing privates
myPublicFunction: function( bar ) {
// Increment our private counter
myPrivateVar++;
// Call our private method using bar
myPrivateMethod( bar );
}
};
})();
我得到了代码中正常发生的事情。但我不明白两对多余的括号,第一个是包裹函数的对,第二个空对在空分号之前。我希望格式看起来更像这样:
var myNamespace = function () {
var myPrivateVar, myPrivateMethod;
// A private counter variable
myPrivateVar = 0;
// A private function which logs any arguments
myPrivateMethod = function( foo ) {
console.log( foo );
};
return {
// A public variable
myPublicVar: "foo",
// A public function utilizing privates
myPublicFunction: function( bar ) {
// Increment our private counter
myPrivateVar++;
// Call our private method using bar
myPrivateMethod( bar );
}
};
};
毋庸置疑,我尝试按照我认为的方式编译代码并返回错误。任何人都能指出我解释为什么它的工作方式如何吗?
答案 0 :(得分:1)
不确定。我们可以简化示例,因此原因很明显:
这为函数赋值:
var func=function(){
return 10;
}
这将函数的结果分配给另一个变量:
var value=func();
现在我们想要调用一个函数而不必命名它,所以我们将上面的行结合起来:
var value=function(){
return 10;
}();
但等等,这看起来太像定义一个函数 - 特别是如果身体太长以至于我们最终看不到这对括号。我们想表明我们正在调用一个无名函数,所以我们通常会这样写:
var value= (function(){
return 10;
})();
用“func”替换括号中的部分,你就会明白我的意思。
答案 1 :(得分:0)
要理解的重要事项是最后一组括号()。这会调用它创建的函数。这称为自调用功能。所以要打破你的代码。
你可以在(函数)周围留下括号,它会运行得很好。最重要的部分是最后的()。
将其视为为函数返回的对象设置变量。
答案 2 :(得分:0)
这很简单。这样做的原因是,当您使用var
创建变量时,它对下一个包含块的范围有限。函数计为包含块。因此,如果在此函数内部声明了一个变量,那么它就不会混淆全局范围内的任何变量。但是,将命名空间变量设置为函数本身是非常非常无用的。 ()
表示嘿,执行此功能。
你可能不会对此感到惊讶:
var something=function(){/*some random stuff*/};
something();
这里完成的事情只是绕过它并直接执行函数,并将命名空间变量设置为返回的对象。