总结下:
- call()和apply()都是函数对象的方法,需要通过函数对象来调用,对象调用call和apply时,会调用函数执行;此时this是window;
function fun() {
//alert('我是fun函数')
console.log(this);
}
fun.call()
fun.apply()
fun() //window
- 也可以将对象指定对括号内的参数,此时this是调用方法的对象;
var obj = {}
fun.call(obj) //obj
fun.apply(obj)
fun(obj)
- 当以构造函数调用时,this是新创建的对象
var obj1 = {
name: "obj1",
sayName: function() {
alert(this.name)
}
}
var obj2 = {
name: "obj2"
}
//fun() //this指向window
//fun.apply(obj1); //修改函数执行时的this
//console.log(fun);
obj1.sayName.apply(obj2) //obj2
- call方法可将实参在对象后依次传递;
- apply则需要将实参封装到一个数组中统一传递;
function fun1(a, b) {
console.log("a=" + a);
console.log("b=" + b);
}
fun1() //a=undefined b=undefined
fun1.call(obj1, 2, 3) //a=2 b=3
fun1.apply(obj1, [2, 3]) //a=2 b=3