1.arguments

arguments.length为函数实参个数,arguments.callee引用函数自身。

arguments他的特性和使用方法

特性:

arguments对象和Function是分不开的。因为arguments这个对象不能显式创建,arguments对象只有函数开始时才可用。

使用方法:

虽然arguments对象并不是一个数组,但是访问单个参数的方式与访问数组元素的方式相同

例如:

arguments[0],arguments[1],。。。。。。。。arguments[n],

在js中 不需要明确指出参数名,就能访问它们,例如:

function test() {
  var s = "";
  for (var i = 0; i < arguments.length; i++) {
    alert(arguments[i]);
    s += arguments[i] + ",";
  }
  return s;
}
test("name", "age")

输出结果:
name,age

我们知道每一个对象都有自己的属性,arguments对象也不例外,首先arguments的访问犹如Array对象一样,用0到arguments.length-1来枚举每一个元素。

下面我们来看看callee属性,返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。callee 属性是 arguments 对象的一个成员,仅当相关函数正在执行时才可用。
callee 属性的初始值就是正被执行的 Function 对象,这允许匿名的递归函数。

var sum = function (n) {
  if (1 == n) {
    return 1;
  } else {
    return n + arguments.callee(n - 1);
  }
}
alert(sum(6)); // 21 = 6 + 5 + 4 + 3 + 2 + 1

通俗一点就是,arguments此对象大多用来针对同个方法多处调用并且传递参数个数不一样时进行使用。根据arguments的索引来判断执行的方法。

2.call

当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作。

callapply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向

二者的作用完全一样,只是接受参数的方式不太一样。
例如,有一个函数 func1 定义如下:
var func1 = function(arg1, arg2) {
  //
};

就可以通过 func1.call(this, arg1, arg2); 或者 func1.apply(this, [arg1, arg2]); 来调用。

其中 this 是你想指定的上下文,他可以任何一个 JavaScript 对象(JavaScript 中一切皆对象),call 需要把参数按顺序传递进去,而 apply 则是把参数放在数组里

JavaScript 中,某个函数的参数数量是不固定的,因此要说适用条件的话,当你的参数是明确知道数量时,用 call,而不确定的时候,用 apply,然后把参数 push 进数组传递进去。当参数数量不确定时,函数内部也可以通过 arguments 这个数组来便利所有的参数。

记忆方法:
猫吃鱼,狗吃肉,奥特曼打小怪兽。
有天狗想吃鱼了
猫.吃鱼.call(狗,鱼)
狗就吃到鱼了
猫成精了,想打怪兽
奥特曼.打小怪兽.call(猫,小怪兽)

3.apply

function.apply()和function.call()基本功能是一样的,但apply却可以授受两个参数,而且第二个参数必须是一个数组。