学习JS需要掌握的五点要素
一、全局变量
在任何函数外面声明的或是未声明直接简单使用的。
1、全局变量与隐式全局变量的区别
通过var创建的全局变量(任何函数之外的程序中创建)是不能被delete操作符删除的。
无var创建的隐式全局变量(无视是否在函数中创建)是能被delete操作符删除的。
二、代码处理
代码处理一般分为两个阶段:
1、第一阶段是变量,函数声明,以及正常格式的参数创建,这是一个解析和进入上下文的阶段。
2、第二个阶段是代码执行,函数表达式和不符合的标识符(未声明的变量)被创建的阶段。
三、for 循环
[html] view plain copy
for (var i = 0; i < arr.length; i ++) {
console.log(arr[i]);
}
这种循环的不足在于每次循环的时候数组长度都要重新获取,尤其当arr不是数组,而是一个htmlcollection对象的时候。每次访问时都要查询dom,这个成本代价是昂贵的。
解决办法:
[javascript] view plain copy
for (var i = 0, max = arr.length; i < len; i ++) {
console.log(arr[i]);
}
/* 性能提升 */
// 第一种变化的形式:
var i, arr = [];
for (i = arr.length; i–-;) {
console.log(arr[i]);
}
// 第二种使用while循环:
var arr = [], i = arr.length;
while (i–-) {
console.log(arr[i]);
}
四、for in 循环
一般for in 循环用于对象的遍历,也被成为“枚举”。有个很重要的方法hasownproperty()方法可以过滤原型链上的属性。例如:
[javascript] view plain copy
// 对象
var man = {
hands: 2,
legs: 2,
heads: 1
};
// 在原型链上添加属性
if (typeof object.prototype.clone === "undefined") {
object.prototype.clone = function () {};
}
// 直接输出
for (var i in man) {
console.log(i, ":", man[i]);
}
/*
控制台显示结果
hands : 2
legs : 2
heads : 1
clone: function()
*/
// 过滤原型链上的clone属性
for (var i in man) {
if (man.hasownproperty(i)) { // 过滤
console.log(i, ":", man[i]);
}
}
/* 控制台显示结果
hands : 2
legs : 2
heads : 1
*/
五、避免使用eval()
eval可以干扰作用域链,也可以访问和修改外部作用域中的变量,function的构造方式虽然与eval类似,但是function更加安全。
上一篇: ELF文件格式
下一篇: iOS路由跳转(一)之初识URL