将 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));
- 解释器不必向上遍历范围来查找依赖项,它们只是在当前范围内可用。
- Location/Namespaces 的依赖关系将来可能会发生变化,但如果您将它们作为参数传入,您只需更改传递的参数,而不是代码中出现的所有地方。
- 缩小,局部变量可以安全重命名
这样做是为了坚持 OPEN/CLOSE 范式。
the open/closed principle states "software entities (classes, modules,
functions, etc.) should be open for extension, but closed for
modification"
要关闭修改,请将依赖项作为参数传递。这允许程序员即时更改它,而不必担心函数中没有使用它的地方。
为什么有些程序员传入全局 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));
- 解释器不必向上遍历范围来查找依赖项,它们只是在当前范围内可用。
- Location/Namespaces 的依赖关系将来可能会发生变化,但如果您将它们作为参数传入,您只需更改传递的参数,而不是代码中出现的所有地方。
- 缩小,局部变量可以安全重命名
这样做是为了坚持 OPEN/CLOSE 范式。
the open/closed principle states "software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification"
要关闭修改,请将依赖项作为参数传递。这允许程序员即时更改它,而不必担心函数中没有使用它的地方。