[关闭]
@brizer 2016-03-14T11:31:39.000000Z 字数 1016 阅读 985

编写可维护的javascript第六章避免使用全局变量


前言

在浏览器中window对象往往重载并等同于全局对象,因此任何在全局作用域中声明的变量和函数都是window对象的属性。


全局变量带来的问题

命名冲突

使用全局变量有命名冲突的风险,无论是和自己的,还是别的开发者又或者是浏览器未来的内置API,都有可能。

代码的脆弱性

一个依赖于全局变量的函数即是深耦合于上下文环境之中。如果环境发生改变,函数很可能就失效了。这意味着任何对全局环境的修改都可能造成某处代码出错。这样代码的可维护性就会变得很差。

难以测试

任何依赖全局变量才能正常工作的函数,只有为其重新创建完整的全局环境才能正确地测试它。而这样,意味着我们需要在生产环境和测试环境都得关系它,并且需要保持两者同步,这样越到后面越难以管理。


单全局变量方式

虽然全局变量有很多缺点,但是我们有时候还是需要使用到全局变量。这个时候最佳方法是依赖尽可能少的全局变量,即只创建一个全局变量

比如jquery中的$就是一个例子。

命名空间

我们可以通过命名空间的方法来管理全局变量,比如NEJ框架就是这样的:

  1. // 以下两者都将建立 window.ui, 然后返回 window.ui.package
  2. var p1 = NEJ.P("ui.package");
  3. var p2 = NEJ.P("window.ui.package");

NEJ.P ,NEJ.C分别是不同的方法,但是都位于NEJ之下,从而统一管理。

模块

模块化开发,模块是一种通用的功能片段,它并没有创建新的全局变量或命名空间,相反,所有的这些代码都存放于一个表示执行一个任务或发布一个接口的单函数中。可以用一个名称来表示这个模块,同样这个模块可以依赖其他模块。


零全局变量

通过创建块级作用域,我们可以得到没有全局变量的效果。这种方法应用场景不多,因此只有在某些特殊场景下才会有用。最常见的情形就是一段不会被其他脚本访问到的完全独立的脚本。之所以存在这种情形,是因为所有所需的脚本都会合并到一个文件,或者因为这段非常短小且不提供任何接口的代码会被插入至一个页面中:

  1. (function(win) {
  2. var doc = win.document;
  3. //code
  4. )(window));

如果代码需要被其他代码所依赖,就不能使用这种零全局变量的方法,如果代码需要在运行时被不断扩张或修改,也不能使用零全局变量的方法。但是,如果代码很短,而不需要和其他代码产生交互,可以考虑使用零全局变量的方法

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注