JavaScript--call(),apply()再次理解

对于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());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值