javascript_core阅读笔记(三)
本系列内容是阅读javascript_core的笔记,原文见http://abruzzi.iteye.com/
13.javascript中的函数对参数的处理十分灵活,可以传递任意数量的参数给一个function
function sum() {
var result = 0;
for ( var i = 0; i < arguments.length; i++) {
var current = arguments[i];
if (isNaN(current)) {
throw new Error("not a number exception");
} else {
result += current;
}
}
return result;
}
alert(sum(1, 2, 3, 4));
alert(sum(5, 6));
alert(sum(1, 2, "ky"));
14.在执行一个函数时,函数的参数和局部变量会作为调用对象的属性进行存储。同时,解释器会为函数创建一个执行器上下文(context),与上下文对应的是作用域链,通常实现为一个链表,链表的每项都是一个对象。在全局作用域中,该链中有且只有一个对象,即全局对象。在一个最外层函数中,作用域链上会有两个对象,第一个是调用对象,第二个为全局对象。如果函数需要用到某个变量,则解释器会遍历作用域链。
作用域链随着嵌套函数的层次会变的很长,但是查找变量的过程依旧是遍历作用域链,自下而上查找,直到找出该值。如果遍历完作用域链仍然没有找到对应的属性,则返回undefined
15.Function.call()和Function.apply()用来修改函数的上下文,函数中的this指针将被替换为call或者apply的第一个参数。apply的第二个参数为函数需要的参数组成的数组,而call则需要跟若干个参数,参数之间以逗号分隔
16.javascript的同一个数组中,可以有各种完全不同类型的元素
17.扩展数组和数组的遍历
Array.prototype.useless= function(){};
var arr = [ 1, 2, 3, 4, 5 ];
alert("length: " + arr.length);// 5
for ( var prop in arr) {
alert(prop + ": " + arr[prop]);// 会输出useless
}
for ( var i = 0; i < arr.length; i++) {
alert(arr[i]);// 不会输出useless
}
从这个例子可以看出,除非必要,尽量不要对全局对象进行扩展,因为对全局对象的扩展会造成所有继承链上都带上“烙印”,有时候会造成一些非常难以发现的BUG