今天我们要讲的是javascript中的一个常见问题,那就是全局变量污染。
全局变量污染指的是在程序中定义的变量没有被正确的限制在特定的作用域内,这样就可能会导致变量名的冲突,从而产生不可预测的后果。下面我们来看一些实例:
// 示例一 var num = 2; function changeNum() { num = 3; } changeNum(); alert(num); // 3
在上述示例中,我们在全局作用域中定义了一个变量num,然后在函数内部对它进行了修改。由于在函数内部没有重新定义一个变量num,所以实际上是在全局上下文中修改的,因此alert会输出3。
// 示例二 var msg = 'Hello'; function printMsg() { alert(msg); var msg = 'World'; } printMsg(); // undefined
在这个示例中,我们在函数内部声明了一个局部变量msg,但是由于在调用alert之前,msg还没有被赋值,因此输出的是undefined。
对于这种情况,我们要避免改动全局变量,尽量使用局部变量,比如用let或const替代var,这样可以限制变量的作用域,避免变量名的冲突。
然而,在某些情况下,我们需要定义一个全局变量,比如在不同的脚本文件中共享变量时。在这种情况下,我们使用全局命名空间是一种较好的解决方案。
// 示例三 var myApp = {}; myApp.num = 2; myApp.changeNum = function() { myApp.num = 3; }; myApp.changeNum(); alert(myApp.num); // 3
在这个示例中,我们定义了一个包含所有全局变量的对象myApp,这样可以避免变量名的冲突。我们在myApp对象中定义了一个变量num和一个方法changeNum,然后在函数内部可以通过myApp.num调用它。
综上所述,全局变量污染是一个容易被遗忘的问题,但是我们要尽可能地避免使用全局变量,而是使用局部变量或命名空间实现全局变量的共享。