JavaScript全局变量的避免(《JavaScript语言精粹》相关笔记)

全局变量是魔鬼。

因为,你不小心,在代码的某一处修改了全局变量, 会导致依赖全局变量的其它模块出错。而且出错原因难调试,难找到。

再者就是,网页运行肯定用到window对象,浏览器引擎又要遍历一次window的属性,性能下降。

那么,如何避免

方法一:只创建一个全局变量。

MYAPP.stooge = {
    "first-name": "Joe",
    "last-name": "Howard"
};

MYAPP.flight = {
    airline: "Oceanic",
    number: 815,
    departure: {
        IATA: "SYD",
        time: "2004-09-22 14:55",
        city: "Sydney"
    },
    arrival: {
        IATA: "LAX",
        time: "2004-09-23 10:42",
        city: "Los Angeles"
    }
};


方法二:使用模块模式

var serial_maker = function (  ) {

// Produce an object that produces unique strings. A
//
 unique string is made up of two parts: a prefix
//
 and a sequence number. The object comes with
//
 methods for setting the prefix and sequence
//
 number, and a gensym method that produces unique
//
 strings.

    var prefix = '';
    var seq = 0;
    return {
        set_prefix: function (p) {
            prefix = String(p);
        },
        set_seq: function (s) {
            seq = s;
        },
        gensym: function (  ) {
            var result = prefix + seq;
            seq += 1;
            return result;
        }
    };
}(  );

var seqer = serial_maker(  );
seqer.set_prefix = 'Q';
seqer.set_seq = 1000;
var unique = seqer.gensym(  );    // unique is "Q1000"

 所谓模块模式,就是创建一个函数,该函数包括,私有变量和一个特权对象,特权对象的内容是,利用闭包能访问到私有变量的函数,最后返回特权对象。

 

首先,方法二,不仅可以当作全局变量用,也可以用在局部声明全局变量。因为就算你在不知道某个地方修改了seqer,就会立即报错,因为这是个对象,不是字符串。

posted @ 2012-06-09 23:03  草珊瑚  阅读(1488)  评论(0编辑  收藏  举报