使用IIFE并传入参数,我应该在什么时候进行?使用Javascript

时间:2013-05-12 18:10:24

标签: javascript parameters iife

我的库的大多数部分都由具有类似结构的文件组成,

myLib.Something = (function() {

     function Something() {

     }

     return Something;

})();

现在假设在Something里面我使用documentwindow,所以现在我的文件看起来像这样;

myLib.Something = (function() {

     function Something(id) {

         this.somethingElse = document.getElementById(id);
     }

     return Something;

})();

Something的构造函数中使用文档时,我应该将文档传递给IIFE,以便它看起来如下所示;

myLib.Something = (function(document) {

     function Something(id) {

         this.somethingElse = document.getElementById(id);
     }

     return Something;

})(document);

或者我应该仅在Something之外使用变量时将变量传递给IIFE?如下所示,

myLib.Something = (function(document) {

     var document = document;

     function Something() {

     }

     return Something;

})(document);

1 个答案:

答案 0 :(得分:4)

正如评论中所提到的,你的第三和第四个例子几乎相当。添加var document = document;不会做任何事情(并且会在严格模式下抛出错误)。

您可能会在这里使用IIFE的原因有两个,尽管在这种情况下我不认为这是必要的。

首先,正如@ C5H8NNaO4所提到的,这可以用来确保你有对全局对象的干净引用。但是,这依赖于在任何用户脚本之前加载脚本。

其次,这将为一些minifiers提供一个提示,他们可以安全地重命名函数内的变量。这可以有时削减一些额外的字节,但它实际上取决于你用来缩小代码的工具。

最后,我可能会这样做的原因是可以帮助您提高代码的可读性。这一点可以辩论,但是当我需要多次使用它们并且它们位于深度名称空间中时,我倾向于将参数传递给我的IIFE。例如:

(function (alias) {

    // do something with alias

} (library.that.has.namespaced.stuff));