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