bind、call、apply是JavaScript中Function.prototype非常重要的三个方法,他们的作用是改变this的指向。三者的区别是:
bind返回一个函数,该函数改变了this的指向。call直接调用函数,也可以传递参数用逗号隔开。apply直接调用函数,也可以传递参数使用数组传递给第二个参数。
我们现在详细解读一下各个函数的实现方式。
bind的实现
bind的基本用法:
- 函数调用
bind,返回一个新的函数。 bind方法的第一个参数是宿主对象,也就是执行的this。bind返回函数执行时候的参数是bind方法第二个至多个参数与调用时参数的合集。
bind简单实现:
1 | Function.prototype.bind = function (context) { |
这个简单的bind已经解决了上面的三个基本用法了,其实bind还有2个附加的特性:
4. 如果上面self不是函数(防止非函数的原型指向Function.prototype),那么会报错。
5. 从改变this的指向来看,new的优先级大于bind。
功能更强大的bind实现:
1 | Function.prototype.bind = function (context) { |
call的实现
call的基本用法:
- 函数调用
call,函数会执行,并且this指向了第一个函数。 call方法的第一个参数是null或者undefined的时候this会绑定在全局对象上。call方法第二个至多个参数会传给执行的方法。
call方法简单实现:
1 | Function.prototype.call = function (context) { |
apply的实现
apply的基本用法:
- 函数调用
apply,函数会执行,并且this指向了第一个函数。 apply方法的第一个参数是null或者undefined的时候this会绑定在全局对象上。apply方法第二个参数是一个数组,相当于函数执行时的参数。
apply方法简单实现:
1 | Function.prototype.apply = function (context, arr) { |