将全局变量传递给自调用函数或“IIFE”的目的
Purpose of passing global vars to self-invoking function or "IIFE"
我在较旧的JavaScript中看到了很多这样的
内容(function (w){
w.bar = 'baz';
})(window);
以上有什么优势,超过
(function(){
window.bar = 'baz';
})();
这同样适用于任何global variable
,或在IIFE
之外定义的变量。
- 明确表示您正在函数中使用(并可能修改)全局变量。
- 允许您在将来修改行为。 也许您有单元测试的
mockWindow
。也许您正在使用 Node.js并且您没有window
,但想添加到globals
var 中。
附言 IMO @Rayon提到的微不足道的性能提升是一条红鲱鱼。
在实践中,与你给出的例子没有太大(任何?)差异,但你可能已经从你实际查看的代码中过度简化了它。
在一个更现实的程序中,你将有范围和回调,它们在事件循环中异步触发和运行,并且你将变量绑定到闭包中的特定实例——所以;
(function (w){
setTimeout(function(){w.bar = 'baz';},100);
})(window);
window = window2;
该栏仍在原始窗口中设置,因为这是绑定到w
的内容 - 在
(function (){
setTimeout(function(){window.bar = 'baz';},10);
})(window);
window = window2;
它将在实例 window2 中设置,因为当代码最终执行时,这就是窗口的绑定方式。
在此示例中,"window"是一个全局变量,但无论绑定的变量的范围如何,情况都是一样的。
传递窗口完成是因为局部变量比全局变量更容易、更快地访问......这可能会显示 性能略有不同 .该方法在模块模式和/或依赖注入中确实派上用场。
例
var moduleFirst = (function(){
var name = "harry";
return {
firstparam : name
}
})();
var moduleTwo = (function(x){
console.log(x.firstparam);
})(moduleFirst)
输出将是:哈利
所以当窗口在IIFE中传递时;它所有揭示的方法都可以在局部变量中使用。
通过将窗口、文档、$ 等全局对象传递给 IIFE(立即调用的函数表达式),可以通过减少范围查找时间来增强性能。请记住,Javascript首先在本地范围内查找属性,然后向上链接直到全局范围。因此,在本地范围访问窗口对象可以减少查找时间。
相关文章:
- IIFE中的函数引用不可用
- JavaScript中的立即调用函数表达式(IIFE)-传递jQuery
- 关于函数的Javascript问题 - IIFE
- 立即调用函数表达式(IIFE)相对于普通函数的优势
- 将全局变量传递给自调用函数或“IIFE”的目的
- 访问IIFE中的函数或变量
- 自动执行函数和IIFE之间的区别
- 在使用 IIFE 函数的角度 js 中无法访问其他控制器中的常量值
- Object.Prototype 方法和 IIFE(立即调用的函数表达式)中的“use strict”
- 将立即调用的函数表达式 (IIFE) 与事件发射器一起使用
- HotTowel Angular 和立即调用的函数表达式 (IIFE)
- Javascript IIFE 匿名函数
- 访问 IIFE 中的构造函数
- PHP中的IIFE(立即调用的函数表达式)
- 如何在立即调用函数表达式(IIFE)中包装JavaScriptrails资产
- Javascript IIFE立即调用函数Expression
- AngularJS:TypeScript编译过程并吞噬uglify-是否有一种方法可以强制TS使用IIFE生成函数而不是
- 可以't从Button访问IIFE内部函数
- 为什么IIFE/函数不能在外部函数中访问“这个”
- Javascript:一个IIFE函数以及供以后使用的函数定义