1. call()和apply():修改函数执行时的上下文对象(this)。
- 这两个方法都是函数对象的方法,需要通过函数对象来调用
- 当对函数调用call()和apply()时都会调用函数执行
- 在调用call()和apply()可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this(参数是谁,this就是谁)
2. 两者区别:
- call()方法可以将实参在对象之后一次传递
- apply()方法需要将实参封装到一个数组中统一传递
function func(a,b){
console.log(this);
console.log(a-b);
}
var obj = {name:'aaa'};
var obj2 = {name:'bbb'};
func(2,1); // window对象
func.call(obj); //obj对象
func.call(obj,2,1);
func.apply(obj2,[2,1]);
3. 在调用函数时,浏览器每次都会传递进两个隐含的参数:
- 函数的上下文对象this
- 封装实参的对象 arguments
arguments是一个类数组对象(不是数组),它也可以通过索引来操作数据,也可以获取长度,
在调用函数时,我们所传递的实参都会在arguments中保存。
arguments.length可以用来获取实参的长度,
即使不定义形参,也可以通过arguments来使用实参,只是比较麻烦(arguments[0]表示第一个实参)。
arguments有一个属性callee,这个属性对应一个函数对象,就是当前正在指向的函数对象。(arguments.callee=fun)