为了避免全局变量碰撞的可能性,盲目地包装每个.js文件是否是一个好主意?盲目防止Javascript全局变量碰撞
(function(){ /*Javascript file contents here*/ })();
如果这个想法是正确的,是否有更好的代码来使用它?
如果文件已经包含该文件,那么是否存在问题,即双嵌套?
为了避免全局变量碰撞的可能性,盲目地包装每个.js文件是否是一个好主意?盲目防止Javascript全局变量碰撞
(function(){ /*Javascript file contents here*/ })();
如果这个想法是正确的,是否有更好的代码来使用它?
如果文件已经包含该文件,那么是否存在问题,即双嵌套?
号
var
使全局。window
对象setTimeout
或从字符串生成onclick
属性)使全局变量。恕我直言,依赖于'setTimeout'或inline(DOM0)处理程序字符串的脚本已经被破坏;-) – Alnitak 2014-10-01 18:59:25
原则上它可能不是一个坏主意,但我会用"use strict"
结合它也可以确保无var
使用的变量被抓住了。
双重嵌套不会实际上破坏任何东西,但请注意,解析全局变量时可能会出现(希望非常小)的性能下降,因为现在有两个范围可以爬出而不是一个。
您看到这个的原因是JavaScript具有基于函数的范围规则。
我们这里有一个立即调用的函数表达式(IIFE),它是JavaScript语言的一个特性,它使得函数能够在一个方便的表达式中被声明和调用。
(function(){ /*Javascript file contents here*/ })();
任何var
或function
此IIFE内声明不会是所述IIFE外部是可见的,除非明确地表明(例如,但返回它们的对象上)。
(function(){
function notRevealed() {}
function revealed() {}
myApp.revealed = revealed;
})(myApp);
notRevealed; //undefined
revealed; //undefined
myApp.revealed //defined
为了赶另一个常见的错误类,你会希望添加'use strict';
到您的函数的顶部,以确保没有var
定义的变量不放在全局对象作为属性上,并且this
不错误地设置为全局对象。
(function(){ 'use strict'; /*Javascript file contents here*/ })();
这样构建代码并不妨碍它污染窗口命名空间。 – amphetamachine 2014-10-01 18:57:16
它不会阻止它,但它可能会有所帮助。 – Alnitak 2014-10-01 19:40:56