我的库的大多数部分都由具有类似结构的文件组成,
myLib.Something = (function() {
function Something() {
}
return Something;
})();
现在假设在Something
里面我使用document
或window
,所以现在我的文件看起来像这样;
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);
答案 0 :(得分:4)
正如评论中所提到的,你的第三和第四个例子几乎相当。添加var document = document;
不会做任何事情(并且会在严格模式下抛出错误)。
您可能会在这里使用IIFE的原因有两个,尽管在这种情况下我不认为这是必要的。
首先,正如@ C5H8NNaO4所提到的,这可以用来确保你有对全局对象的干净引用。但是,这依赖于在任何用户脚本之前加载脚本。
其次,这将为一些minifiers提供一个提示,他们可以安全地重命名函数内的变量。这可以有时削减一些额外的字节,但它实际上取决于你用来缩小代码的工具。
最后,我可能会这样做的原因是可以帮助您提高代码的可读性。这一点可以辩论,但是当我需要多次使用它们并且它们位于深度名称空间中时,我倾向于将参数传递给我的IIFE。例如:
(function (alias) {
// do something with alias
} (library.that.has.namespaced.stuff));