传递给IIFE包装器有多少全局变量是有意义的

How many globals make sense to be passed to the IIFE wrapper?

本文关键字:全局变量 多少 有意义 IIFE 包装      更新时间:2024-02-19

向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次以上,那么传递更多信息有意义吗?

如果你那么关心缩小,当然,为什么不呢?

常见的情况是,只要我看到任何地方(windowdocumentundefined),就可以通过3。

是的,尽管您经常看到不通过document或通过jQuery(别名为$)。当然,这不仅关乎缩小,还关乎性能,因此您只关心windowdocument

传递尽可能多的全局变量总是有意义的,对吧?

好吧,除非你在代码中不使用它们。SymbolObjectErrorDateJSONMath等在大多数代码中都不需要。开发人员不喜欢每次更改代码时都进行你建议的字节计数,所以这个IEFE样板保持原样(当然,它有很多货物狂热)。

如果你真的在乎的话,你会让你的迷你人自动做到这一点。