将函数导出与使用自调函数相比,有什么好处?

4

我查看了很多代码,也看到很多人这样做

module.exports = (function(){
  return {
    functionA: function() {

      }
    },
    functionB: function() {

    }
  };
})();

那么,为什么不直接这样做呢?
module.exports = {
  functionA: function() {

  },
  functionB: function() {

  }
};

谢谢!


自调用函数在第一个例子中保留内部函数的作用域/上下文。有关Node.js模块的更多信息,请参见https://dev59.com/DWIj5IYBdhLWcg3w04Qo。 - adamkonrad
3个回答

5
你的第一个示例可以让你隐藏变量在它自己的闭包作用域内,这些变量可以与返回对象的方法共享。例如,如果你执行以下操作...
var foo = (function(){
   var x = 2;
      return {
        addToTwo: function(y){
        return x + y;
      },
      subtractFromTwo: function(y){
        return x - y;
      }
   }
};

上面的示例表明,变量x受到保护,并在addToTwosubtractFromTwo之间共享。第二个示例只允许您将x作为对象的一部分,而不具有同样的保护措施。
module.exports = {
  x: 3,
  functionA: function() {
     return this.x;
  },

};

在这个例子中,x 可以被修改。

1

这两者完全相同,这是一个风格上的决定。

根据 Node.js 的文档:

模块本地的变量将会是私有的,就好像模块被包装在一个函数中一样。

你也可以这样做:

module.exports.functionA = function() {

};

module.exports.functionB = function() {

};

或者:

// either method for creating a function works
function functionA () {}

var functionB = function () {} 

module.exports = {
    functionA : functionA,
    functionB : functionB
};

为什么这个回答被踩了?它是一个有信息量的回答。虽然它并没有真正回答“为什么”人们会这样做,但问题中那部分也没有很好的答案。 - Pointy

0

直接调用函数的最大优点之一是使用闭包,这是无法以分离的方式获得的,因此它们在字面上并不相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接