全局变量
在js代码不同的作用域中,都可以访问到全局变量,这就降低了代码的安全性,所以应尽量减少全局变量的使用。
在js中全局变量的声明方式有很多种,可以用var,这是最标准的生命方式,但是如果出现下面这种写法,执行结果也不会出错:
myname='john';
console.log(myname); //john
这种书写方式相当于:
window.myname='john';
即:给全局对象(window)定义了一个属性,注意,myname是window的一个属性,也就是说通过语句:
delete myname;
可以删除掉这个值,即
console.log(myname); // undefined
但是,一个变量是没有办法通过delete方法删除的。
需要注意的是,如果一个变量没有经过定义就进行运算符运算,则也相当于给全局对象添加了一个属性。即:
function fn(){
a="123";
}
fn();
console.log(a); //123
delete(a);
console.log(a); //error:a is not defined
所以,我们在编写代码时,应尽可能减少全局变量的使用,并且按照严格的定义规范定义变量。
for循环
在for循环中我们总会忽略掉一些细微的问题,这在程序的运行结果上不会产生错误的结果,但是会大大降低代码的执行速度,这种问题在代码量十分庞大的程序中表现的十分明显,看下面这段代码:
for(var i=0;i<arr.length;i++){}
这段代码在执行的过程中,每次判断条件是否成立时,都要重新获取一下arr的长度,造成了很不必要的时间浪费,所以应该采用下面这种写法:
for(var i=0,max=arr.length;i<max;i++){}
这样,再循环过程中就只获取了一次arr的长度,大大减少时间成本。
避免隐式类型转换,进行比较值和表达式类型时用 === 或 !==
减少eval()的使用
使用eval会使被执行的代码被篡改,在setInterval()和setTimeout()中若将函数写成字符串形式会产生和eval()相同的效果,所以要尽量写成函数名。
eval()还有一个弊端:eval()会干扰作用域链,可以访问和修改它外部作用域中的变量,如果使用Function或new Function(这两者是相同的),他们只会看到全局作用域,可以避免本地变量污染
其他书写规范,比如空格、缩进、变量命名采用驼峰命名法等不再赘述