1、尽可能少用全局变量 这是一个疑问最少,同时流传最 广的一条.Javascript使用函数管理做用域,全局变量最大的问题在于同名变量冲突.这种隐患产生比较直接的两个缘由就是Javascript语言的特性形成的,即变量不用声明就能够直接使用以及变量不经过var直接使用则默认定义为全局变量. function fun(){ var a=b=0; //a是局部变量,b是全局变量 }
2、变量释放时是有反作用的 在Javascript中你能够经过delete操做将对象属性删除或者说撤销.使用var建立的全局变量不能经过delete删除,没有使用var的隐含式全局变量能够经过delete删除.若是这么说你不能理解,那么再进一步说隐含式的全局变量严格来说不是真意义的全局变量,而是全局对象的属性,属性能够经过delete 删除,单变量不行。面试 |
|
3、全局变量的访问 并不全部的状况下都能经过window对象访问到全局对象,若是它不叫window对象了,咱们能够经过另外一种方式取到全局对象:
var gloabl = (function(){ return this; }());
通常来说,this在函数内部做为一个函数调用时,每每指向全局对象.数组 4、单一var变量声明 function fun(){ var a = 1, b = 2, c = 3, d = {}, e, f; } 这么作的好处在于: (1)提供单一的地址以查找函数所须要的全部局部变量. (2)在顶部声明,防止出现未声明就是用的错误逻辑. (3)更少的编码,更直观显示定义好的变量.函数 5、变量的"提高"问题 这类问题我常常在不少公司的面试题里看到,用来考察最做用域以及变量声明的理解.不过这里咱们要看一点更实在的问题. 所谓的变量提高,这里提高的仅仅是声明.在Javascript中不管在哪里声明,效果都等同于在函数顶部声明,可是若是使用在声明以前可能会致使逻辑的错误.这里不得不举一个很常见的例子: name = "global"; function fun(){ alert(name); var name = "local"; alert(name); } fun(); // undefined // local
这里你要区分开声明和赋值是两个动做,被"提高"的仅仅是声明.this 代码处理上分了两个阶段: 第一阶段建立变量、函数声明以及形参.这是解析和进入上下文的阶段; 第二个阶段是代码运行时,执行过程以及建立函数表达和不合格标识符; 因此在 ECMAScript其实没有"提高"的概念,这是一种表述.编码 6、for循环 for (var i = 0,len=arr.length-1; i < len; i++) { };
每次循环不要老是从新计算集合总长,尤为是DOM元素集合时.另一点是推荐逐步减到0的循环,即i--,由于同0比较要快于同数组长度比较.spa 7、循环的差别以及hasOwnProperty() 在Javascript的通常使用上,for和for in可能没有结果上的不一样,不过仍是推荐遍历数组时使用for,若是遍历的是对象属性则使用for in.这里有一个小坑就是遍历对象属性来过滤遇到的原型链属性时,使用hasOwnProperty()方法是很重要的.prototype 看看代码就明白我说的意思了:对象 var obj = {
a:1,
b:2,
c:3
};
if(typeof Object.prototype.clone === "undefined"){
Object.prototype.clone = function(){
}
}
for(key in obj){
console.log(key);
} 这里输出的结果中会有clone,但其实不少时候咱们是不想要原型链上的属性的,此时就能够经过hasOwnProperty()过滤掉原型链上的属性. for(key in obj){ if(obj.hasOwnProperty(key)){ console.log(key); } }
8、不要增长内置的原型 增长内置构造函数的原型是颇有诱惑的,方便的同时也会带来维护以及协做上难以预知的风险.相似Object()或者Array()等都是不可取的.若是有相似的须要能够经过原型增长属性的方式实现,我常常作的就是为Array增长remove的function.ip if (typeof Array.prototype.remove === "undefined") { Array.prototype.remove = function(){ } };
9、勿忘JS隐式类型转换,尽可能避免 由于JS的弱类型特性,因此对于数据类型的肯定并不规范.在使用比较语句时会执行隐式类型转换,因此当执行false==0或者""==0这种比较会返回true.因此当要进行比较的时候应该尽可能使用===或者!===操做符来保证彻底匹配.ci 10、不要省略parseInt()的参数 parseInt()的第二个参数是一个进制参数,一般能够忽略,可是最好不要这样作.由于当解析的字符串是0开头的就会报错.并且ECMA3和ECMA5对此的处理标准还不同,因此为了不不可预知的问题,最好是加上禁止参数. 最后还有一些很是隐晦的坑,点出来只能经过你们本身注意了.编码规范,好比空格,缩进,大括号位置等,方法以及变量命名规则,这个只有等你后来维护代码的时候才会发如今没有完整注释以及文档的状况下,好的命名是多么重要. |