将大量全球价值传递给IIFE是否有意义?
就我看到的任何地方而言,常见的事情就是传递3(窗口,文档和未定义)。 但是......如果在代码中使用超过10次只是因为缩小的事实,传递更多是否有意义?
在我的例子中,我在代码中找到了14次全局变量Math
。将它传递给IIFE以节省42个字节是有意义的。在这种情况下并不是很多,但如果我们逐点总结不同的全局变量,那么传递尽可能多的全局变量总是有意义的,对吧? (符号,对象,错误,日期,JSON ......)
(function($, window, document, Math, undefined) {
$.fn.mydemo = function() {
};
}(jQuery, window, document, Math));
那么,为什么这不是一种常见的方法呢?
解释减少的42个字节:
答案 0 :(得分:2)
首先,这些值不是IIFE。
这不是通过在函数内部使用较短的变量名称(至少不是主要的)来“保存字符”,而是关于变量查找和与之相关的“成本”。
如果你要使用f.e. document
在您的函数内部而不传入它,然后首先在函数范围内搜索名为document
的变量,并且只有当它失败时,搜索将继续在上面的范围内,所以上。
那是将这些对象作为参数传递给函数的原因 - 因此在函数范围内存在直接对它们的引用,并且它们不必在更高的外部范围内被抬头看。
有时,您甚至可能会看到这样使用的形式:
(function(document) {
// do something with document, such as:
document.foo();
document.bar = "baz";
})(document);
- 在那种形式中,应该更清楚的是,这不是关于在变量名中保存字符。该对象在函数内部仍被称为document
(这使得它应该表示它应该代表什么 - 全局 document
对象),并且仅 通过这种方式实现的效果就是更短的查找。
答案 1 :(得分:2)
在许多情况下,将变量传递给IIFE是有意义的。
将变量传递给IIFE允许您在函数内重命名变量。这在使用jQuery时尤为常见,尤其是在使用noConflict
时:
(function ($) {
//in here $ will be the same as jQuery
}(jQuery));
当你看到类似的东西时,别名也可以帮助minifiers缩小代码:
(function (document, slice, Math) {
...
}(document, Array.prototype.slice, Math));
minifier可以将参数重命名为它想要的任何值,并保存字节。对于使用这些属性的大型脚本,当它变成时可以节省很多:
(function(a,b,c){...}(document,Array.prototype.slice,Math));
这更像是一般情况下的边缘情况,但通常会以下列形式看到全球IIF:
(function (global /* or window */) {
...
}(this));
这允许node.js和浏览器之间的可移植性,以便全局变量在两个环境中具有相同的名称。
虽然我已经提到缩放器可以通过更改别名的名称来减少字符数,但如果您参与code golf challenge,则可能需要手动执行此操作。
如果您正在创作一个必须在其转入的任何环境中工作的脚本(想想谷歌分析),那么您需要确保您调用的全局方法就是您的期望。通过将它们作为参数传递来存储对这些函数的引用是保持对函数的引用不被恶意或无知程序员覆盖的一种方法。
要回答标题中的问题:
将多少全局变量传递给IIFE包装器?
尽可能多的你需要而不是更多。如果需要别名一个或两个变量,请传递一个或两个引用。如果您需要确保未更改全局函数,则最终可能会有100个参数。对此没有严格的规定。
答案 2 :(得分:1)
如果在代码中使用超过10次只是因为缩小的事实,传递更多是否有意义?
如果你非常关心缩小,那么为什么不呢?
就我所见到的地方而言,常见的事情就是传递3(
window
,document
和undefined
)
Yes,尽管你没有看到没有传递document
,或者传递jQuery
(别名为$
)。当然,这不仅仅是关于缩小,而是about performance,而你只关心window
和document
。
传递尽可能多的全局变量总是有意义的,对吗?
好吧,除非您不在代码中使用它们。我需要Symbol
,Object
,Error
,Date
,JSON
,Math
以及其他 在大多数代码中。并且开发人员不喜欢每次更改一些代码时都会使用这些字节数,因此这个IEFE样板文件保持原样(并且imho有很多货物崇拜)。
如果你真的在意,你会让你的迷你者自动这样做。