对于call(),和apply()的作用对于大家已经不是什么陌生的东西了,他们是改变this指向。
function add (a,b) {
console.log(a+b)
}
function sub (a,b) {
console.log(a-b)
}
add.call(sub,1,2)
这个例子就是使sub可以使用add的方法,也就加法。
例子很好的解释了call apply的用法,但是给我了另一困惑:使用add不就可以了,为什么还要这么麻烦的转换一下。
这就要说一下call与apply的用途。
一、改变this的指向
// 用途一:改变this的指向
window.name = 'name_window'
var obj1 = {
name : 'name_obj1'
}
var obj2 = {
name : 'name_obj2'
}
function getName () {
console.log(this.name)
}
getName()
getName.call(obj1)
getName.call(obj2)
// 不使用call,为了实现上面相同效果 声明函数getName2
function getName2 (obj) {
console.log(obj.name)
}
getName2(obj1)
getName2(obj2)
getName2() //报错,因为没有参数
解释一下:getName()打印的this.name ,正常调用的话,this是window对象,所以会显示“name_window“,但是当用了call后将this指向了obj1/obj2,所以就得道了“name_obj1/obj2“,当然我也写了一个可以输出name的getName2,但是这个函数是对于obj1/obj2这种形式的对象特意写的,并不能适应更多的情况,直接输出getName2()还会报错,它就不如getName灵活。
启发:通过call我们可以调用其他函数,来完成我们需要写一个函数才能达到的目的,这样少些了代码,提高了代码的重用率。
当在一些情况下this被莫名改变指向之后,可以使用call或apply来进行修正this的指向。
document.getElementById('div1').onclick = function(){
alert(this.id);// div1
var fun1 = function(){
alert(this.id);// window.id 即undefined
}
fun1(); // undefined
}
使用call修正this
document.getElementById('div1').onclick = function(){
alert(this.id);
var fun1 = function(){
alert(this.id);
}
fun1.call(this);// 强制函数内的this为外层的this,
}
不过我们一般是不知道我们错的,只有发现错之后才会这么做,或者凭借经验直接写成这样。
二、调用其他对象的函数
var obj1 = {
a:1,
b:2,
add:function()
{
return this.a + this.b;
}
}
var obj2 = {
a:1,
b:2,
}
var result = obj1.add.call(obj2);//用obj1的函数来计算obj2的两个属性的和
alert(result);//输出3
借用构造函数实现类似继承的效果
var A = function(name)
{
this.name = name;
};
var B = function(){
A.apply(this,arguments)
}
B.prototype.getName = function(){
return this.name;
}
var b = new B('jack');
alert(b.getName());