【问题标题】:Passing in window into IIFE and other dependencies also from window也从窗口将窗口传递到 IIFE 和其他依赖项
【发布时间】:2015-06-28 03:43:57
【问题描述】:

为什么有些程序员会传入全局 window 对象,我理解这是为了更好的性能和最小化的好处,还有来自完全相同的全局空间 window 的其他依赖对象/函数但通过另一个参数传入?

但是他们也使用来自window 的函数,它们没有显式传入,例如setTimeout()

(function (dependency1, dependency2, dependency3, dependency4) {
    'use strict';

    //body

    window.setTimeout(function() { // <--
        //body
    }, 1000);

    //etc.
}(window, window.document, window.AjaxRequest, window.util.padNumber)); // <--

使用顶级变体对以下变体有什么好处,基本上仍然可以访问相同的依赖项?

(function (window) {
    'use strict';

    //body

    window.setTimeout(function() {
        //body
    }, 1000);

    //etc.
}(window));

【问题讨论】:

    标签: javascript oop dependencies iife


    【解决方案1】:
    1. 解释器不必遍历作用域来查找依赖项,它们仅在当前作用域中可用。
    2. 依赖项的位置/命名空间将来可能会发生变化,但如果您将它们作为参数传递,您只需更改传递的参数,而不是代码中出现的所有情况。
    3. 缩小,局部变量可以安全地重命名

    【讨论】:

    • 但是假设我使用来自 JS 的本机可用对象/函数,它们位于 window 中,例如 Date()setTimeout()clearInterval()Array()。大多数时候我看到程序员只将window 传递给IIFE。为什么?那么将所有这些依赖对象/函数也显式地传递到 IIFE 中不是更好吗?
    • 一般来说你是对的。我会说大部分时间是(window, document)。这只是因为大多数这个对象被多次访问,用于 DOM 操作等。你也会看到很多次,有人通过他最喜欢的库,因为它也被多次访问,比如 jQuery:(window, document, window.jQuery) 当然你可以传入window.Date,但你多久访问一次?一两次?因此,也许您稍微优化了范围查找,但由于代码中的字符更多,因此创建了更长的下载时间。所以找到一个平衡点;)
    • 所以基本上如果我有一个可以发送 AJAX 请求的函数,但我只在代码中使用它一次,我真的不必将它传递给 IIFE,因为这会被考虑微优化?
    【解决方案2】:

    这样做是为了坚持 OPEN/CLOSE 范例。

    开放/封闭原则指出“软件实体(类、模块、 功能等)应该对扩展开放,但对扩展关闭 修改”

    要关闭修改,请将依赖项作为参数传递。这使程序员可以随时更改它,而不必担心函数中没有使用它的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2010-12-16
      相关资源
      最近更新 更多