1、最小全局变量
全局变量:在任何函数内部声明或未声明而直接使用的变量。
全局对象:在任何函数的外部可以使用this访问,window指向该全局对象。
全局变量是全局对象的属性。
2、全局变量的问题
由于页面中常含引入的第三方文件,故可能存在命名冲突的问题,导致先定义的变量被覆盖。
不使用var声明的变量会隐含成为全局变量,如:result = 0;
避免出现全局变量命名冲突的办法是尽量使用var对变量进行声明,
可以使用链分配:var a,b; 但不要使用任务链:var a=b=0;该写法会导致b成为隐式全局变量。
3、var声明的全局变量与隐式全局变量的区别
var声明的全局变量不能通过delete global_var 删除;
隐式全局变量可以通过delete 进行删除。
4、访问全局对象
可在任何层级的函数作用域中访问全局对象:
var global = (function () {
return this;
}());
5、避免全局变量命名冲突的方法
单var模式
function func() {
var a = 1,
b = 2,
sum = a + b,
myobject = {},
i,
j;
// function body...
}
初始化变量同时初始化值的做法是很好的。
当使用DOM(文档对象模型)引用时,可以使用单一的var把DOM引用一起指定为局部变量,就如下面代码所示:
function updateElement() {
var el = document.getElementById("result"),
style = el.style;
// 使用el和style干点其他什么事...
}
6、var声明提升
// 反例
myname = "global"; // 全局变量
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
所有的变量声明会被悬置到函数的顶部,为了避免这种混乱,最好是预先声明你想使用的全部变量。
7、for循环
当你循环获取值时,缓存数组(或集合)的长度是比较好的形式
for (var i = 0, max = myarray.length; i < max; i++) {
// 使用myarray[i]做点什么
}
8、for-in循环
for-in
循环应该用在非数组对象的遍历上,使用for-in
进行循环也被称为“枚举”
hasOwnProperty()
方法,当遍历对象属性的时候可以过滤掉从原型链上下来的属性
待补充
9、避免扩增构造函数的prototype属性
增加内置的构造函数原型会严重降低了可维护性,除非确保满足以下原则:
待补充
10、switch模式
case以break清楚结束
避免贯穿
11、避免隐式类型转换
==与===的区别
12、避免使用eval()
eval()存在安全隐患,被执行的代码可能已经被篡改
如果你绝对必须使用eval(),你 可以考虑使用new Function()代替。
另一种方法来阻止自动全局变量是封装eval()调用到一个即时函数中
13、parseInt的使用
在ECMAScript 3中,开头为”0″的字符串被当做8进制处理了,但这已在ECMAScript 5中改变了。为了避免矛盾和意外的结果,总是指定基数参数。
var month = "06",
year = "09";
month = parseInt(month, 10);
year = parseInt(year, 10);
此例中,如果你忽略了基数参数,如parseInt(year),返回的值将是0,因为“09”被当做8进制(好比执行 parseInt( year, 8 )),而09在8进制中不是个有效数字。替换方法是将字符串转换成数字,包括:
+"08" // 结果是 8
Number("08") // 8
14、缩进、花括号等相关使用
15、命名规范
以大写首字母写构造函数
驼峰命名法
常数:字母全大写
使用一个下划线前缀来表示一个私有属性或方法