Javascript 对象文字符号中的额外括号
我正在阅读“学习Javascript设计模式”一书,我遇到了一个我不能完全理解的特点。查看以下代码段:Javascript 对象文字符号中的额外括号,javascript,object-literal,Javascript,Object Literal,我正在阅读“学习Javascript设计模式”一书,我遇到了一个我不能完全理解的特点。查看以下代码段: var myNamespace = (function () { var myPrivateVar, myPrivateMethod; // A private counter variable myPrivateVar = 0; // A private function which logs any arguments myPrivateMethod = func
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 );
}
};
};
var value= (function(){
return 10;
})();
不用说,我试着以我认为应该的方式编译代码,结果返回了错误。有人能给我解释一下为什么会这样吗?重要的是要理解最后一组括号()。这将调用它创建的函数。这称为自调用函数。所以要分解你的代码
可以把它看作是为函数返回的对象设置一个变量。这很简单。原因是,当您使用
var
创建变量时,它对下一个包含块的作用域是有限的。函数计为包含块。因此,如果在这个函数中声明了一个变量,那么它就不可能弄乱全局范围内的任何变量。但是,将名称空间变量设置为函数本身是非常非常无用的。()
表示嘿,执行这个函数
看到这一点,您可能不会感到惊讶:
var something=function(){/*some random stuff*/};
something();
这里的操作方式只是绕过它,直接执行函数,并将名称空间变量设置为返回的对象。当然。我们可以简化该示例,使原因显而易见: 这将为变量指定一个函数:
var func=function(){
return 10;
}
var value=func();
这将函数的结果分配给另一个变量:
var func=function(){
return 10;
}
var value=func();
现在,我们想调用一个函数而不必命名它,因此我们结合了上面几行:
var value=function(){
return 10;
}();
但是,等等,这看起来太像定义一个函数了——特别是如果主体太长了,以至于我们在最后看不到一对括号。我们想表明我们正在调用一个无名函数,所以按照惯例我们这样写:
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 value= (function(){
return 10;
})();
将括号中的部分替换为“func”,您将了解我的意思。javascript未编译。。。它的解释=)我们不需要指出,这只是一个增加可读性的惯例。谢谢Bergi。编辑以反映您的评论。谢谢,这现在更有意义了。