apply, call 与 bind
预计 5 分钟
这三个函数都与改变函数执行时的上下文有关。其又分为两类:
Function.prototype.apply与Function.prototype.call为一类。它们会立即调用函数。Function.prototype.bind为一类,其会返回一个绑定了作用域的函数而不立即被调用。
Function.prototype.apply
apply 接收两个参数第一个是要绑定给 this 的值,第二个是参数数组(array-like object)。
作用:
- 绑定作用域
- 方便一些函数的调用(诸如
Math.max)
绑定作用域相信就不用详细说明了,简单的说就是指定函数内部 this 的指向。
这里举一个方便函数调用的例子,大家知道,Math.max 接收一系列数字作为参数,但是不接收数组,使用 apply 就可以做到传递数组了:
不过,在 ES2015 中这应该不是问题了,因为可以使用扩展运算符(...
)
Function.prototype.call
call 的作用与 apply 完全相同,只是使用方法有所不同,需要将参数一个一个传入。另外由于 ES2015 中的扩展运算符,似乎 call 和 apply 在在任何场景都可以互相替换了。个人认为使用哪一个函数看个人习惯了。
Function.prototype.bind
bind 与前两个函数不同之处在于,前两个函数会立即执行,而 bind 做的仅仅是绑定作用域,然后供之后调用。
关于 bind 还有一点值得说明的是,当一个函数调用 bind 绑定 thisArg 之后,企图再去调用 bind 去绑定另一个上下文,或者去调用 apply 或者 call 来改变上下文是没有用的。
来看一下 bind 的简单实现(粗略实现,实际实现内容更多)
当第一次调用 bind 之后就形成了一个闭包,再改变上下文也不会改变最后执行的结果。
更新记录
- 2016 年 10 月 18 日增加
bind的描述。
#学习笔记
#前端
#JavaScript