以下两个代码段之间有什么区别?我已经看到用于模块模式,闭包和更高级别的函数声明。适合两者的用途是什么?
(function(){
})();
(function(window){
})(window);
答案 0 :(得分:3)
在这种情况下,语义差异很小。但是,如果在整个代码中使用了window
,则将其作为局部变量进行别名化可以实现更好的缩小。
(function (window) { window['foo'] = window['baz']; })(window);
可以缩小为
(function(w){w['foo']=w['baz']})(window)
如果没有本地别名,则window
无法缩小,而缩小将改为
(function(){window['foo']=window['baz']})()
还有其他原因以及类似技巧的其他用例。请查看this问题,以找到更深入的解释。
答案 1 :(得分:1)
(function(window){
})(window);
现在,当您在此处传递窗口(window);
时,这是一个全局窗口对象。
这是为该功能创建的窗口的本地副本。
(function(window){
})
执行此操作时,
(function(window){
console.log(window.x)
})
您正在引用本地副本而不是全局副本,但它们只保留对全局窗口对象的引用,因此最终您仍在访问默认窗口对象。
因此行为没有变化,但窗口对象是本地复制的。