call,apply,bind的作用
都是Function的原型方法
Function.prototype.bind()
bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。
Function.prototype.apply()
apply() 方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。
Function.prototype.call()
call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。
call() 方法的语法和作用与 apply() 方法类似,只有一个区别,就是 call() 方法接受的是一个参数列表,而 apply() 方法接受的是一个包含多个参数的数组。
bind() 方法和call方法的不同之处在于,bind() 方法返回一个新的函数,而call方法会直接调用此函数。
call 的模拟实现
Function.prototype.call()
call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。
我们所要做的和注意的有以下几点:
- call 函数是 Function 的一个原型方法
- call 改变了原函数 this 的指向,this 变成了给定的第一个参数
- call 函数的第一个参数应该是对象或者能转换成对象
- 该函数执行了,并返回了结果
- 给出多个参数时,从第二个参数到最后一个参数作为函数的实参进行调用
- call 的第一个参数可以传 null/undefined,当为 null/undefined 的时候,视为指向全局对象
实际实现如下:
1 | Function.prototype.call = function(context) { |
apply 的模拟实现
Function.prototype.apply()
apply() 方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。
apply的模拟实现和call类似,需要注意的是apply的第二个参数是一个数组(或类似数组对象)。
实际实现如下:
1 | Function.prototype.apply = function(context, arr) { |
bind 的模拟实现
Function.prototype.bind()
bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。
我们所要做的和注意的有以下几点:
- bind 函数是 Function 的一个原型方法
- 直接调用时 bind 改变了 this 的指向,this 变成了给定的第一个参数
- bind 函数的第一个参数应该是对象或者能转换成对象
- bind 函数返回的是一个函数而不是函数执行的结果
- 给出多个参数时,从第二个参数到最后一个参数作为函数的实参进行调用
- bind 返回的函数在调用时,可以继续添加参数
- 当 bind 返回的函数作为构造函数的时候,bind 时指定的 this 值会失效,但传入的参数依然生效。
实际实现如下:
1 | Function.prototype.bind = Function.prototype.bind || function (context) { |
es5-shim
完整的模拟实现参考 es5-shim