Js进阶2-call、apply、bind方法总结

callapplybind 方法一般用来指定 this 的环境,在没有学之前,通常会有这些问题。

var a = {
  user:"akl",
  fn:function(){
    console.log(this.user);
  }
}
var b = a.fn;
b(); // undefined

我们是想打印对象 a 里面的 user 却打印出来 undefined 是怎么回事呢?如果我们直接执行 a.fn() 是可以的。

var a = {
  user:"akl",
  fn:function(){
    console.log(this.user);
  }
}
a.fn(); // akl

这里能够打印是因为,这里的 this 指向的是函数 a

虽然这种方法可以达到我们的目的,但是有时候我们不得不将这个对象保存到另外的一个变量中,那么就可以通过以下方法。

一、call()

var a = {
  user:"akl",
  fn:function(){
    console.log(this.user); // akl
  }
}
var b = a.fn;
b.call(a);

通过在 call 方法,给第一个参数添加要把 b 添加到哪个环境中,可以改变 this 的指向。简单来说,this 就会指向那个对象

call 方法除了第一个参数以外还可以添加多个参数,如下:

var a = {
  user:"akl",
  fn:function(e, ee){
    console.log(this.user); // akl
    console.log(e + ee); // 3
  }
}
var b = a.fn;
b.call(a, 1, 2);

二、apply()

apply 方法和 call 方法有些相似,它也可以改变this的指向

var a = {
  user:"akl",
  fn:function(){
    console.log(this.user); // akl
  }
}
var b = a.fn;
b.apply(a);

同样 apply 也可以有多个参数,但是不同的是,第二个参数必须是一个数组,如下:

var a = {
  user:"akl",
  fn:function(e, ee){
    console.log(this.user); // akl
    console.log(e + ee); // 11
  }
}
var b = a.fn;
b.apply(a,[10, 1]);

或者

var a = {
  user:"akl",
  fn:function(e, ee){
    console.log(this.user); // akl
    console.log(e + ee); // 520
  }
}
var b = a.fn;
var arr = [500,20];
b.apply(a, arr);

注意如果 callapply 的第一个参数写的是 null,那么 this 指向的是 window 对象

var a = {
  user:"akl",
  fn:function(){
    console.log(this); // Window {external: Object, chrome: Object, document: document, a: Object, speechSynthesis: SpeechSynthesis…}
  }
}
var b = a.fn;
b.apply(null);

三、bind()

bind 方法和 call、apply 方法有些不同,但是不管怎么说它们都可以用来改变 this 的指向

先来说说它们的不同吧。

var a = {
  user:"akl",
  fn:function(){
    console.log(this.user);
  }
}
var b = a.fn;
b.bind(a);

我们发现代码没有被打印,对,这就是 bind 和 call、apply 方法的不同,实际上 bind 方法返回的是一个修改过后的函数

var a = {
  user:"akl",
  fn:function(){
    console.log(this.user);
  }
}
var b = a.fn;
var c = b.bind(a);
console.log(c); // function() { [native code] }

那么我们现在执行一下函数 c 看看,能不能打印出对象 a 里面的 user:

var a = {
  user:"akl",
  fn:function(){
    console.log(this.user); // akl
  }
}
var b = a.fn;
var c = b.bind(a);
c();

ok,同样 bind 也可以有多个参数,并且参数可以在执行的时候再次添加,但是要注意的是,参数是按照形参的顺序进行排列的。

var a = {
  user:"akl",
  fn:function(e, d, f){
    console.log(this.user); // akl
    console.log(e, d, f); // 10 1 2
  }
}
var b = a.fn;
var c = b.bind(a, 10);
c(1, 2);

总结:callapply 都是改变上下文中的 this 并立即执行这个函数bind 方法可以让对应的函数想什么时候调用就什么时候调用,并且可以将参数在执行的时候添加,这是它们的区别,根据自己的实际情况来选择使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴雪月乔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值