首页 > 技术文章 > 如何减少全局变量污染?

hjvsdr 2017-09-06 16:36 原文

如何减少全局变量污染?

尽量避免全局变量是个老生常谈的问题了,但确实非常重要,JS可以随意定义全局变量,不幸的是,全局变量会削弱程序的灵活性,随意使用全局变量,也许会因为命名冲突而导致不可预知的问题,所以应该避免。

全局变量的三种定义方式:

  1. 在任何函数外部var声明一个变量;
  2. 在window对象中声明一个变量;
  3. 在函数内部不先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全局变量

哈哈,这个方法直接杜绝了全局变量,那就是不在全局声明变量(包括隐式声明全局变量);

 

推荐阅读