这两种javascript结构之间的区别是什么

这两种javascript结构之间的区别是什么,javascript,Javascript,执行似乎返回相同的对象。i、 例如,myObject包含 var myObject = (function(){ var value = 0; return { getValue: function(){ return value; } } }()); var myObject = (function(){ var value = 0; return { getValue: function(){ return

执行似乎返回相同的对象。i、 例如,myObject包含

var myObject = (function(){

  var value = 0;

  return {
    getValue: function(){
      return value;
    }
  }

}());



var myObject = (function(){

  var value = 0;

  return {
    getValue: function(){
      return value;
    }
  }

})();
在这两种情况下

我知道类似于
(function(){})(
执行的东西,因为
(function(){})
是一个返回函数的表达式,后面的
()
执行返回的函数


但是为什么要执行
(function(){}())
?我以为这里会出现语法错误。

这些短语在功能上是相同的,
()
的位置是一个品味问题,我已经看到了有利于另一个的方向。就我个人而言,我更喜欢

  {{
    getValue: function(){
      return value;
    }
  }}
创建函数并在括号内执行它

(function() { ... }());

在括号内创建函数,然后执行它

这些短语在功能上是完全相同的,
()
的位置是一个品味的问题,我已经看到了有利于另一个的方向。就我个人而言,我更喜欢

  {{
    getValue: function(){
      return value;
    }
  }}
创建函数并在括号内执行它

(function() { ... }());
在括号内创建函数,然后执行它

它们是相同的

至于为什么
(function(){}())
没有给出语法错误,但是
function(){}()
给出了语法错误,我认为这是因为解析器在遇到
function
时会认为它是一个函数声明,而不是一个函数表达式,但当它看到
)时,它会抱怨,因为函数声明必须有一个名称。但是当它看到
首先在
函数之前
时,这不可能是一个函数声明,所以它认为这是一个函数表达式

对于
(function(){})(
,只需在调用函数表达式之前将其括在括号中即可。

它们是相同的

至于为什么
(function(){}())
没有给出语法错误,但是
function(){}()
给出了语法错误,我认为这是因为解析器在遇到
function
时会认为它是一个函数声明而不是一个函数表达式,但当它看到
()
,它抱怨函数声明必须有一个名称。但是当它看到
函数之前先看到
)时,它认为这不可能是函数声明,所以它认为这是函数表达式


对于
(function(){})(
),在调用函数表达式之前,只需将其括在括号中。

这在语法上是有效的,因为open paren会消除函数表达式的歧义(按照),这就是为什么
function(){}()
是一个语法错误,但是
(function(){}())
在语法上不是
函数的原因(){}()
似乎不是一个错误。我在发布问题后尝试了这个方法。我认为这本质上意味着封闭的
()
在第一种情况下被忽略。如果我错了,请纠正我。您的两个示例都将函数定义转换为函数表达式,而不仅仅是函数定义。JS解析器需要知道它是哪一个,这样它才不会出错。@ShaggyInjun哦,是的,赋值使它明确无误,我只是在尝试一个裸
函数如果调用
call,您也认为这在语法上是有效的,因为open paren会消除函数表达式的歧义(按照),这就是为什么
function(){}()
是一个语法错误,但是
(function(){}())
在语法上不是
function(){}()
似乎不是一个错误。我在发布问题后尝试了这一点。我认为这本质上意味着附上的
()
在第一种情况下被忽略。如果我错了,请纠正我。您的两个示例都将函数定义转换为函数表达式,而不仅仅是函数定义。JS解析器需要知道它是哪一个,这样它才不会出错。@ShaggyInjun哦,是的,赋值使它明确无误,我只是在尝试一个裸
函数不过,你说得对