繁体   English   中英

有多少全局变量可以传递给IIFE包装器?

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

将大量全球价值传递给IIFE在什么程度上有意义?

常见的事情是,只要在我到处都可以看到3(窗口,文档和未定义),就传递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。

这不是关于通过在函数内部使用较短的变量名称来“节省字符”(至少不是主要是),而是关于变量查找和与之关联的“成本”。

如果要在函数内部使用fe 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和浏览器之间进行可移植性,以便全局变量在两种环境中都具有相同的名称。

角色节省

虽然我已经提到过,缩小器可以通过更改别名来减少字符数,但是如果您参加代码高尔夫挑战赛 ,则可能需要手动进行操作。

参考安全

如果您要编写一个必须在转储到的任何环境中运行的脚本(请考虑使用Google Analytics(分析)),则需要确保所调用的全局方法符合您的期望。 通过将这些函数作为参数传递来存储对这些函数的引用是一种防止对该函数的引用被恶意或无知的程序员覆盖的一种方法。


要回答标题中的问题:

有多少全局变量可以传递给IIFE包装器?

只要您需要,就没有更多了。 如果您需要为一个或两个变量加上别名,请传递一个或两个引用。 如果需要确保未更改全局函数,则可能会得到100个参数。 对此没有硬性规定。

如果为了最小化而在代码中使用了10次以上,则通过更多次是否有意义?

如果您非常关心缩小问题,那么,为什么不呢?

普通的事情是,只要我到处都可以看到3( windowdocumentundefined

是的 ,尽管您没有像过去那样经常传递documentjQuery (别名为$ )。 当然,这不仅与缩小有关,而且与性能有关 ,并且您只代表该windowdocument

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

好吧,除非您不在代码中使用它们。 在大多数代码中通常不需要使用SymbolObjectErrorDateJSONMath和其他代码。 而且开发人员不喜欢在每次更改一些代码时都建议您建议这些字节数,因此,此IEFE样板保持不变(并且恕我直言,这是很多货源)。

如果您真的很在意,可以让您的缩小器自动执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM