js基础_46、函数的方法call和apply
—-这两个方法都是函数对象的方法,需要通过函数对象来调用
—-当对函数调用call()和apply()都会调用函数执行。
比如:
fun.call();
fun.apply();
fun();
以上三种效果一致。
—-在调用call()和apply()可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this。
var obj={name:'obj'};
var obj2={name:'obj2'};
function fun(){
alert(this);
}
//fun();
//fun.call(obj2);
fun.call(obj2.name);
以函数形式调用时:this为window,如图:
以call方法调用时,this为传递的实参,如图:
在对象里定义一个方法,使用call方法调用和函数调用:
var obj={
name:'obj',
sayname:function(name){
alert(this.name);
}
};
var obj2={name:'obj2'};
function fun(){
alert(this);
}
obj.sayname(obj2);//obj.sayname();不用传也一样
使用函数调用this始终为自己,输出结果如图:
函数调用:
var obj={
name:'obj',
sayname:function(name){
alert(this.name);
}
};
var obj2={name:'obj2'};
function fun(){
alert(this);
}
obj.sayname.call(obj2);
方法指定了对象,所以对象为obj2,结果如图:
call()和apply()的区别:
—-call()方法可以将实参在对象之后依次传递,
比如:
function fun(a,b){
console.log('a='+a);
console.log('b='+b);
}
var obj={
name:'obj',
sayname:function(name){
alert(this.name);
}
};
var obj2={name:'obj2'};
fun.call(obj,2,3);
输出如图:
—-apply()方法需要将实参封装到一个数组中统一传递
function fun(a,b){
console.log('a='+a);
console.log('b='+b);
}
var obj={
name:'obj',
sayname:function(name){
alert(this.name);
}
};
var obj2={name:'obj2'};
fun.apply(obj,[2,3]);
总结,这两个方法可以改变this的指向,一个直接传参,一个封装在数组中传参。总结,这两个方法是改变this的指向,一个直接传参,一个封装在数组中传参。
this的情况:
1、以函数的形式调用时,this永远都是window
2、以方法的形式调用时,this是调用此方法的那个对象
3、以构造函数的形式调用时,this是构造函数的创建的那个新对象(实例)。
4、使用call()和apply()形式调用时,this是指定的那个对象。