将 window 传入 IIFE 和其他依赖项也来自 window

Passing in window into IIFE and other dependencies also from window

为什么有些程序员传入全局 window 对象,我理解这是为了更好的性能和最小化的好处,还有来自完全相同的全局 space 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));
  1. 解释器不必向上遍历范围来查找依赖项,它们只是在当前范围内可用。
  2. Location/Namespaces 的依赖关系将来可能会发生变化,但如果您将它们作为参数传入,您只需更改传递的参数,而不是代码中出现的所有地方。
  3. 缩小,局部变量可以安全重命名

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

the open/closed principle states "software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification"

要关闭修改,请将依赖项作为参数传递。这允许程序员即时更改它,而不必担心函数中没有使用它的地方。