改变this指向

82 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

前言

当我们在调用this的时候,我不想让他遵循“谁调用他,他就指向谁”的规矩,想让他去指向别人能不能实现呢?答案是当然可以。下面就讲一讲改变this指向的三种方法。

改变this指向的方法

改变this指向的方法一共有三种,分别是:call、apply和bind。这三种方法有相同的地方也有不同的地方,在我看来这些方法都是差不多的,只要记住一个便能联想到第二个第三个。

第一种      Call   

       obj1.getName.call(obj2,1,2,3,....,n)   //这里就是举个例子,方便看清楚

     在用call来改变this指向时,他会立即执行函数,并改变this指向为他的第一个参数

     它可以接受多个参数,除了第一个参数是用来改变this指向的参数,其余有多的参数都会传到函数变为它的形参。

第二种      Apply

      obj1.getName.apply(obj2,[1,2,3,....,n])   //就接受两个参数

apply跟call基本来说都是差不多的,就在参数方面有点区别

在用apply来改变this指向时,他跟call一样会立即执行函数,并改变this指向为他的第一个参数

参数的话apply跟call就不一样了,apply只能接受两个参数,第一个参数是用来改变this指向的参数,但是他第二个参数是一个数组,你可以在里面写多个数据,这些数据一个一个的也都会传到函数变为他的形参。

 

第三种      Bind

      var fun1=obj1.getName.bind(obj2,1,2,....,n)  //将改变指向后的函数形成新函数
      fun1()    //调用新的函数,这里可能会有人认为既然是在窗口调用的fun1函数,为什么不是指向window
      // 是因为在形成fun1函数时,bind方法已经把this指向了obj2了,所以在窗口调用时,还是指向obj2

 Bind跟上面两种方法,最大的区别就是它不会执行函数,它会形成一个新的函数。

 bind方法后面跟的参数跟call方法一样,都是可以接受多个参数,将除了第一个之外的参数作为函数形参传入。

这个方法就是为了改变this指向而生的,他只能改变this指向并形成一个全新的函数,在我们需要用到它的时候才手动的去调用它。