对象文字表示法中的额外括号

时间:2014-01-21 01:43:23

标签: javascript object-literal

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

    }
  };

};

毋庸置疑,我尝试按照我认为的方式编译代码并返回错误。任何人都能指出我解释为什么它的工作方式如何吗?

3 个答案:

答案 0 :(得分:1)

不确定。我们可以简化示例,因此原因很明显:

这为函数赋值:

var func=function(){
  return 10;
}

这将函数的结果分配给另一个变量:

var value=func();

现在我们想要调用一个函数而不必命名它,所以我们将上面的行结合起来:

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

但等等,这看起来太像定义一个函数 - 特别是如果身体太长以至于我们最终看不到这对括号。我们想表明我们正在调用一个无名函数,所以我们通常会这样写:

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

用“func”替换括号中的部分,你就会明白我的意思。

答案 1 :(得分:0)

要理解的重要事项是最后一组括号()。这会调用它创建的函数。这称为自调用功能。所以要打破你的代码。

  1. 声明变量命名空间。
  2. 然后创建
  3. 功能
  4. 然后调用该函数
  5. 然后返回return语句中的对象
  6. 然后将命名空间设置为返回对象的值
  7. 你可以在(函数)周围留下括号,它会运行得很好。最重要的部分是最后的()。

    将其视为为函数返回的对象设置变量。

答案 2 :(得分:0)

这很简单。这样做的原因是,当您使用var创建变量时,它对下一个包含块的范围有限。函数计为包含块。因此,如果在此函数内部声明了一个变量,那么它就不会混淆全局范围内的任何变量。但是,将命名空间变量设置为函数本身是非常非常无用的。 ()表示嘿,执行此功能

你可能不会对此感到惊讶:

var something=function(){/*some random stuff*/};
something();

这里完成的事情只是绕过它并直接执行函数,并将命名空间变量设置为返回的对象。