将大量全局值传递给 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 字节
- 缩小后数学将被单个字符替换
- 由于函数可以定义为 function($, 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
(这清楚地表明了它应该代表什么 - global document
对象),由此实现的唯一效果就是较短的查找。
关于javascript - 有多少全局变量适合传递给 IIFE 包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28615068/