日期:2014-05-16  浏览次数:20307 次

javascript学习记录1
1.Arguments对象

   arguments对象是一个类似数组的对象,可以按照数目获取传递给函数的参数值,所以可以用了验证函数是否使用了正确数目的实际参数;它不是真正的数组,因为它没有实现数组的所有行为。arguments对象和命了名字的参数不过是引用同一变量的两种方法;
  function f(x){
    print(x);//原来的参数值
     arguments[0]=null;
print(x);// null
}

arguments.callee()用了引用未命名的函数自身

arguments.length 是实际传入的参数数目
Function.length  是函数声明的参数数目

2.apply(),call()

使用这两个方法可以像调用其他方法一样调用函数。第一个参数是要调用的函数的对象,也就是函数执行的上下文;所以这两个方法可以用了改变函数的执行环境;
f.call(o,1,2);
类似于:
o.m=f;
o.m(1,2);
delete o.m;

apply方法与call的区别是,传递给函数的参数由数字指定;所以可以直接把arguments对象传入;

3。作用于链

js的函数是通过词法来划分作用域的,而不是动态划分的,意味着当函数定义的时候,当前的作用域链就保存起来了,而且作为函数内部状态的一部分;
一个有趣的例子:
function manfunc(x){
return function() { return x;}
}

var a = [makefunc(0),makefunc(1),makefunc(2)];

alert(a[0]()); //0
alert(a[1]()); //1
alert(a[2]()); //2

解析:
makefunc的作用域链是全局对象
嵌套函数的作用域链是makefunc->全局对象
当makefunc被调用的时候作用域链包含它自己的调用对象,全局对象
当嵌套函数被调用的时候作用域链包含:它自己的调用对象,makefunc的调用对象,全局对象

当makefunc调用结束的时候,嵌套函数的引用被返回保存在了全局对象里面,同时在它的调用对象里面也保存了这个引用。所以它自己的调用对象不会立即销毁,特定的变量得到维持。所以在a[0]调用时,可以引用manfunc的调用对象,