如何减少全局变量污染?
尽量避免全局变量是个老生常谈的问题了,但确实非常重要,JS可以随意定义全局变量,不幸的是,全局变量会削弱程序的灵活性,随意使用全局变量,也许会因为命名冲突而导致不可预知的问题,所以应该避免。
全局变量的三种定义方式:
- 在任何函数外部var声明一个变量;
- 在window对象中声明一个变量;
- 在函数内部不先var声明变量后直接使用变量(隐式全局变量)
一、使用唯一全局变量
这个方法是在全局声明一个对象字面量,作为我们的全局变量容器,这样全局就只出现一个全局变量:
var myApp = {};
此时,变量myApp就成了我们的变量容器了,所有的全局变量都可以保存在这里:
1 myApp.students = { 2 name:"小明", 3 age:18 4 }; 5 6 myApp.teachers = { 7 A: { 8 姓名:"李老师", 9 gender:"男" 10 }, 11 B: { 12 姓名:"朱老师", 13 gender:"女" 14 } 15 };
只要把多个全局变量都整理在同一个命名空间下,就能显著降低与其他应用程序、组件或类库之间产生不可预知的相互影响的可能性,也使其可读性更高。
二、使用闭包
闭包的概念:一个函数嵌套有内部函数,该内部函数可以访问外层函数的变量,且该外部函数的return为内部函数,这就被称为闭包。
不懂闭包的童鞋请参考阮一峰老师的文章:http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
使用闭包,也能显著减少全局变量污染,就是创建一个函数,该函数包括,私有变量和一个特权对象,特权对象的内容是,利用闭包能访问到私有变量的函数,最后返回特权对象。
//创建函数,返回一个特权对象
var f3 = function() { var age = 18; return { name: "啊哈", age: age, gender: "男" } }(); //获取变量 f3.name = "啊哈";
对于闭包,还有一个方法,就是使用匿名自执行函数,其实这货就是个如假包换的闭包,所有代码写在其中,在它内部声明的变量全部都是局部变量,一般用来写完全独立的脚本,比如jQuery,插件等。。。
(function() { //我在一个匿名自执行函数中 //some code here... })()
三、0全局变量
哈哈,这个方法直接杜绝了全局变量,那就是不在全局声明变量(包括隐式声明全局变量);