call、apply、bind相关

是什么?

bind,call,apply都是用来改变this指向的

什么是this?为什么要改变this指向?

  • 在浏览器中,在全局范围内this 指向window对象;
  • 在普通函数中,this永远指向最后调用他的那个对象;
  • 在构造函数中,this指向new出来的那个新的对象;
  • call、apply、bind中的this被强绑定在指定的那个对象上;
  • 箭头函数中this比较特殊,箭头函数this为父作用域的this,不是调用时的this.要知道前四种方式,都是调用时确定,也就是动态的,而箭头函数的this指向是静态的,声明的时候就确定了下来;
  • 所以箭头函数的this是无法修改的
  • apply、call、bind都是js给函数内置的一些API,调用他们可以为函数指定this的执行,同时也可以传参。

在一个函数调用的时候,this就是一个指针,this值取决于这个函数是怎样被调用的,这就有点变态了,也就是说,this的指向不是固定的,当this指向不是我们的理想指向时,我们就要想办法去改变this的指向。

例如:

 

如上所示,当函数嵌套一个内层函数时,为什么我们在外层函数将this指向赋值给that保存一下,而不是在内层函数中直接使用this呢,因为内层函数Zpy1并不会继承外层函数Zpy的this值,内层函数的this此时指向的是它的调用者Zpy1。

怎么用?

上代码:

如图所示:

如果想让Zpy.info()打印对象Sj的信息,则需要改变this指向,让this指向对象Sj,

三种方法有什么区别?

 

 

写法上的区别如图:

bind()与apply()、call()不同的是,bind方法返回的仍然是一个函数,因此后面还需要()来进行调用才可以。

传参时的区别如图:

call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别。

那么bind怎么传参呢?它可以像call那样传参。

Zpy.info.bind(Sj,"38","小坏蛋")();

但是由于bind返回的仍然是一个函数,所以我们还可以在调用的时候再进行传参。

Zpy.info.bind(Sj)("38","小坏蛋");

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值