[英]Javascript: Call global function from within Self-Invoking Anonymous Function / Immediately-Invoked Function Expression (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
之外定义的IIFE
。
mockWindow
。 也许您正在使用Node.js并且您没有window
,但是想要添加到globals
var。 ps 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传递窗口时; 所有显示的方法都可以在局部变量中使用。
通过将全局对象(如window,document,$)传递给IIFE(立即调用函数表达式),可以通过缩短范围查找时间来提高性能。 记住Javascript首先在本地范围内查找属性,然后向上链接到全局范围。 因此,在本地范围访问窗口对象会减少查找时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.