2014-10-01 50 views
0

为了避免全局变量碰撞的可能性,盲目地包装每个.js文件是否是一个好主意?盲目防止Javascript全局变量碰撞

(function(){ /*Javascript file contents here*/ })(); 

如果这个想法是正确的,是否有更好的代码来使用它?

如果文件已经包含该文件,那么是否存在问题,即双嵌套?

+1

这样构建代码并不妨碍它污染窗口命名空间。 – amphetamachine 2014-10-01 18:57:16

+0

它不会阻止它,但它可能会有所帮助。 – Alnitak 2014-10-01 19:40:56

回答

0

  • 它不会停止脚本通过省略var使全局。
  • 它不会停止脚本通过显式设置它们为window对象
  • 的性能可能会破裂依赖于全局脚本(通过,例如,使字符串setTimeout或从字符串生成onclick属性)使全局变量。
+1

恕我直言,依赖于'setTimeout'或inline(DOM0)处理程序字符串的脚本已经被破坏;-) – Alnitak 2014-10-01 18:59:25

1

原则上它可能不是一个坏主意,但我会用"use strict"结合它也可以确保无var使用的变量被抓住了。

双重嵌套不会实际上破坏任何东西,但请注意,解析全局变量时可能会出现(希望非常小)的性能下降,因为现在有两个范围可以爬出而不是一个。

1

您看到这个的原因是JavaScript具有基于函数的范围规则。

我们这里有一个立即调用的函数表达式(IIFE),它是JavaScript语言的一个特性,它使得函数能够在一个方便的表达式中被声明和调用。

(function(){ /*Javascript file contents here*/ })(); 

任何varfunction此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*/ })();