Javascript 为什么我必须立即调用一个立即调用的函数表达式?

Javascript 为什么我必须立即调用一个立即调用的函数表达式?,javascript,module,Javascript,Module,如果我有: var calc = function(){ return { adder: function(x,y){return x+y;} } }; calc(); calc.adder(4,5); 计算加法器未定义。但是,如果我立即调用calc作为 var calc = function(){ return { adder: function(x,y){return x+y;} } }(); calc.adder(4,5); 事情按预期进行。为什么第一个

如果我有:

var calc = function(){
  return {
    adder: function(x,y){return x+y;}
  }
};
calc();
calc.adder(4,5);
计算加法器未定义。但是,如果我立即调用calc作为

var calc = function(){
  return {
    adder: function(x,y){return x+y;}
  }
}();
calc.adder(4,5);
事情按预期进行。为什么第一个示例失败?

第一个代码集
calc()
是一个返回包含名为
adder()
的函数的对象的函数。因此,这将起作用

var calc = function(){
    return {
        adder: function(x,y){return x+y;}
    }
};

var cal = calc();
cal.adder(4,5);
代码行

calc();
将返回的对象存储在无变量中,因此无法使用该对象

第二代码集
您发布的第二个示例本质上是相同的。calc变量不再是一个函数,而是使用
()
执行未命名函数时返回的对象

因为
calc()
返回一个新函数,而您没有将该新函数分配给任何对象,因此该函数已丢失,无法用于后续的方法调用。您可以执行
calc().adder(…)
。或者你可以做
var c=calc();c、 adder(…)
。只是学究一点,如果不立即调用它,那么它就不是“立即调用的函数表达式”。这只是一个函数表达式。有趣的Andrew-因此,如果它是用第一种方法编写的,则必须始终使用calc().adder(4,5)调用它,而使用第二种方法,则可以使用calc.adder(4,5)调用它。所以,另外一个问题,这个问题有点奇怪!您有一个返回对象的函数。如果不调用该函数,则无法取回该对象。