模拟思路
- 将当前函数设置为 call、apply 对象的属性
- 执行该属性
- 删除该属性
- 返回值
call() 模拟实现
es5实现
1 | //简单模拟Symbol属性 |
es6 实现
1 | Function.prototype.myCall = function (context, ...args) { |
apply() 模拟实现
es5实现
1 | //简单模拟Symbol属性 |
es6实现
1 | Function.prototype.myApply=function(context, args){ |
用apply() 实现 call()
1 | Function.prototype.callOne = function(context) { |
bind() 模拟实现
- 修改
this
指向 - 动态传递参数
- 兼容
new
关键字
一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。
也就是说当 bind 返回的函数作为构造函数的时候,bind 时指定的 this 值会失效,但传入的参数依然生效。
1 | var value = 2; |
注意:尽管在全局和 foo 中都声明了 value 值,最后依然返回了 undefind,说明绑定的 this 失效了,如果大家了解 new 的模拟实现,就会知道这个时候的 this 已经指向了 obj。
es5实现
1 | Function.prototype.myBind = function (context) { |
es6实现
1 | Function.prototype.myBind = function(context) { |