传递给IIFE包装器有多少全局变量是有意义的
How many globals make sense to be passed to the IIFE wrapper?
向IIFE传递大量全局值在多大程度上有意义?
常见的情况是,只要我看到任何地方(窗口、文档和未定义),就可以通过3。但是如果仅仅为了缩小而在代码中使用了10次以上,那么传递更多信息有意义吗?
在我的例子中,我在代码中找到了14次全局变量Math
。为了节省42个字节,将其传递给IIFE是有意义的。在这种情况下,这不是很多,但如果我们一点一点地求和不同的全局变量,那么传递尽可能多的全局变量总是有意义的,对吧?(符号、对象、错误、日期、JSON…)
(function($, window, document, Math, undefined) {
$.fn.mydemo = function() {
};
}(jQuery, window, document, Math));
那么,为什么这不是一种常见的方法呢?
更新:
为了解释42字节的缩减:
- 数学=4个字符
- 1个字符=1个字节
- 14倍数学=56字节
- 缩小后,数学将替换为单个字符
- 由于函数可以定义为函数($,w,d,m,u)
- 缩写词Math(m)的14个字符=14字节
- 56-14=缩减42字节
首先,这些值不是IIFE。
这并不是通过在函数中使用较短的变量名来"保存字符"(至少不是主要的),而是关于变量查找及其相关的"成本"
如果在函数中使用f.e.document
而不传入,那么首先会在函数的范围内搜索一个名为document
的变量,只有当搜索失败时,才会在该范围以上的范围内继续搜索,依此类推
这是将此类对象作为参数传递到函数中的原因,因此在函数范围内存在对它们的直接引用,并且不必在更高的外部范围中查找它们。
有时,你甚至可能会看到它以这样的形式使用:
(function(document) {
// do something with document, such as:
document.foo();
document.bar = "baz";
})(document);
–在这种形式下,应该更清楚的是,这与在变量名中保存字符无关。该对象在函数中仍被称为document
(这清楚地表明了它应该代表什么——全局document
对象),由此实现的仅效果被称为更短的查找。
在许多情况下,将变量传递给IIFE是有意义的。
别名
通过将变量传递给IIFE,可以重命名函数中的变量。这在使用jQuery时很常见,尤其是在使用noConflict
时:
(function ($) {
//in here $ will be the same as jQuery
}(jQuery));
别名也有助于缩小缩小程序缩小代码,当你看到这样的东西时:
(function (document, slice, Math) {
...
}(document, Array.prototype.slice, Math));
迷你程序可以将参数重命名为它想要的任何参数,并为您节省字节。对于大量使用这些属性的大型脚本,当它变成时,可以节省大量费用
(function(a,b,c){...}(document,Array.prototype.slice,Math));
便携性
这更像是一种边缘情况,而不是一般规则,但通常可以看到以下形式的全局IIF:
(function (global /* or window */) {
...
}(this));
这允许node.js和浏览器之间的可移植性,因此全局变量在两种环境中都具有相同的名称。
字符节省
虽然我已经提到了迷你程序可以通过更改别名来减少字符数,但如果您正在参加代码高尔夫挑战,您可能需要手动执行此操作。
参考安全性
如果你正在编写一个必须在任何环境中工作的脚本(想想谷歌分析),你需要确保你调用的全局方法是你所期望的。通过将这些函数作为参数传递来存储对它们的引用,是防止恶意或无知的程序员重写对函数的引用的一种方法。
回答标题中的问题:
传递给IIFE包装器有多少全局变量是有意义的?
你需要多少就多少,不再需要了。如果需要对一个或两个变量进行别名,请传递一个或多个引用。如果你需要确保全局函数没有被更改,你可能会得到100个参数。这方面没有硬性规定。
如果仅仅为了缩小而在代码中使用了10次以上,那么传递更多信息有意义吗?
如果你那么关心缩小,当然,为什么不呢?
常见的情况是,只要我看到任何地方(
window
、document
和undefined
),就可以通过3。
是的,尽管您经常看到不通过document
或通过jQuery
(别名为$
)。当然,这不仅关乎缩小,还关乎性能,因此您只关心window
和document
。
传递尽可能多的全局变量总是有意义的,对吧?
好吧,除非你在代码中不使用它们。Symbol
、Object
、Error
、Date
、JSON
、Math
等在大多数代码中都不需要。开发人员不喜欢每次更改代码时都进行你建议的字节计数,所以这个IEFE样板保持原样(当然,它有很多货物狂热)。
如果你真的在乎的话,你会让你的迷你人自动做到这一点。
- 全局变量和全局对象的属性之间有什么区别吗
- delete关键字在全局变量上的不同行为
- 在javascript函数中设置全局变量
- 如何将getJson的响应保存在全局变量中
- 从Javascript方法返回全局变量
- AngularJS中的封装窗口全局变量
- javascript隐式全局变量
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 如何使全局变量仅特定于该文件
- 在page.open()-PhantomJS中无法访问全局变量
- 使用全局变量来存储数字(JavaScript)
- 如何将变量声明为全局变量
- 在节点中创建文件全局变量
- 在Javascript中使用全局变量作为缓存是很好的
- 创建要在其他函数中使用的全局变量
- 为了避免创建全局变量,可以将所有变量分配给一个对象吗
- 函数中的innerHTML(全局变量?)
- 如何在javascript中为全局变量赋值
- 全局变量只能由第一个函数访问
- 传递给IIFE包装器有多少全局变量是有意义的