call,apply,bind这三个方法其实都是继承自Function.prototype中的,属于实例方法。
1. call()
函数实例的call方法,可以指定该函数内部this的指向(即函数执行时所在的作用域),然后在所指定的作用域中,调用该函数。并且会立即执行该函数。
call()方法可以传递两个参数
- 第一个参数是指定函数内部中this的指向(也就是函数执行时所在的作用域),
- 第二个参数是函数调用时需要传递的参数。
2. apply()
apply方法的作用与call方法类似,也是改变this指向(函数执行时所在的作用域),然后在指定的作用域中,调用该函数。同时也会立即执行该函数。唯一的区别就是,它接收一个数组作为函数执行时的参数。
3. bind()
bind方法用于指定函数内部的this指向(执行时所在的作用域),然后返回一个新函数。bind方法并非立即执行一个函数
总结:
call,apply,bind方法的联系和区别
-
第一个参数都是指定函数内部中this的指向(函数执行时所在的作用域),然后根据指定的作用域,调用该函数。
-
都可以在函数调用时传递参数。call,bind方法需要直接传入,而apply方法需要以数组的形式传入。
-
call,apply方法是在调用之后立即执行函数,而bind方法没有立即执行,需要将函数再执行一遍。有点闭包的味道。
-
改变this对象的指向问题不仅有call,apply,bind方法,也可以使用that变量来固定this的指向。