JavaScript全局变量的避免(《JavaScript语言精粹》相关笔记)
2012-06-09 23:03
633 查看
全局变量是魔鬼。
因为,你不小心,在代码的某一处修改了全局变量, 会导致依赖全局变量的其它模块出错。而且出错原因难调试,难找到。
再者就是,网页运行肯定用到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,就会立即报错,因为这是个对象,不是字符串。
因为,你不小心,在代码的某一处修改了全局变量, 会导致依赖全局变量的其它模块出错。而且出错原因难调试,难找到。
再者就是,网页运行肯定用到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,就会立即报错,因为这是个对象,不是字符串。
相关文章推荐
- JavaScript学习笔记-JavaScript声明全局变量三种方式的异同
- javascript基础笔记(八)之js的全局变量和局部变量
- 笔记——避免全局变量污染
- javascript学习笔记(二):定义函数、调用函数、参数、返回值、局部和全局变量
- <<编写可维护的JavaScript>>之避免使用全局变量
- JavaScript学习笔记: 局部变量和全局变量
- 开发笔记:Python中的全局变量
- C++笔记:头文件相互包含和全局变量
- 如何让js不产生冲突,避免全局变量的泛滥,合理运用命名空间
- 理运用命名空间让js不产生冲突避免全局变量的泛滥
- 罗云彬win32汇编教程笔记 Win32汇编的全局变量与局部变量
- Javascript高级程序设计第二版第四章--变量,作用域及内存问题--笔记
- javascript中的全局变量,局部变量,this易错点
- JavaScript中局部变量与全局变量
- Javascript全局变量var与不var的区别深入解析
- 跟我学JavaScript--作用域,局部变量,全局变量,变量生命周期
- 面试题之JavaScript 的全局变量与局部变量
- JavaScript的相关继承笔记以及使用外部库实现JavaScript的面向对象特性
- javascript笔记--(第十二章)变量、作用域及内存
- struts1中应尽量避免使用全局变量!