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

我正在阅读“学习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 );

    }
  };

};
var value= (function(){
  return 10;
})();

不用说,我试着以我认为应该的方式编译代码,结果返回了错误。有人能给我解释一下为什么会这样吗?

重要的是要理解最后一组括号()。这将调用它创建的函数。这称为自调用函数。所以要分解你的代码

  • 已声明变量名称空间
  • 然后创建函数
  • 然后调用该函数
  • 然后返回return语句中的对象
  • 然后将名称空间设置为返回对象的值
  • 您可以省略(函数)周围的括号,这样它就可以正常运行了。最重要的部分是结尾的()


    可以把它看作是为函数返回的对象设置一个变量。

    这很简单。原因是,当您使用
    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。编辑以反映您的评论。谢谢,这现在更有意义了。