开启掘金成长之旅!这是我参与「掘金日新计划 · 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指向并形成一个全新的函数,在我们需要用到它的时候才手动的去调用它。