三者区别
apply、call、bind 三者都是函数的一个方法,第一个参数都是 this 要指向的对象,也就是想指定的上下文;
apply、call、bind 三者都可以利用后续参数传参,其中只有apply()后续参数以数组形式传;
bind 是返回对应的绑定函数,便于稍后调用;apply、call 则是立即调用。
1 | const parent = { |
原理 & 实现
call & apply
可以看看这个JavaScript深入之call和apply的模拟实现
fn.apply(obj, array)实现的原理:
- 将要执行的函数fn设置为该对象obj的属性
- 执行obj.fn(args)函数
- 不能给这个obj对象新增新的属性,所以要删除这个属性;
- 其中对obj要做判断,为null或undefined时,要把this指向window
1 | Function.prototype.call = function (context) { |
bind
bind其实是在call、apply基础上封装了一层,因此多次调用bind,只会第一次生效;
1 | parent.run.bind(child, "tom").bind(child1, "jack").bind(child2, "Rachael")(); |
简单的实现:(实际要复杂一些)
1 | Function.prototype.myBind = function (context) { |