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) { |