2

我图书馆的大部分部分都是由具有类似结构的文件组成的,

myLib.Something = (function() {

     function Something() {

     }

     return Something;

})();

现在假设在Something我使用的内部documentwindow现在我的文件看起来像这样;

myLib.Something = (function() {

     function Something(id) {

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

     return Something;

})();

Something的构造函数中使用 document 时,我应该将 document 传递给 IIFE,使其如下所示;

myLib.Something = (function(document) {

     function Something(id) {

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

     return Something;

})(document);

或者我应该只在变量在外部使用时将它们传递给 IIFE Something?如下图,

myLib.Something = (function(document) {

     var document = document;

     function Something() {

     }

     return Something;

})(document);
4

1 回答 1

4

如评论中所述,您的第三个和第四个示例几乎等效。添加var document = document;什么都不做(并且会在严格模式下抛出错误)。

您可以在这里使用 IIFE 有几个原因,尽管我认为在这种情况下它不是必需的。

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

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

最后,我可能这样做的原因是它有助于提高代码的可读性。这一点可能有争议,但是当我需要多次使用它们并且它们驻留在深层命名空间中时,我倾向于将参数传递到我的 IIFE 中。例如:

(function (alias) {

    // do something with alias

} (library.that.has.namespaced.stuff));
于 2013-05-13T15:23:17.770 回答