javascript_core阅读笔记(三)

来源:互联网 发布:上海网络推广招聘 编辑:程序博客网 时间:2024/04/30 10:13
本系列内容是阅读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);// 5for ( var prop in arr) {    alert(prop + ": " + arr[prop]);// 会输出useless}for ( var i = 0; i < arr.length; i++) {    alert(arr[i]);// 不会输出useless}

从这个例子可以看出,除非必要,尽量不要对全局对象进行扩展,因为对全局对象的扩展会造成所有继承链上都带上“烙印”,有时候会造成一些非常难以发现的BUG