个人理解:
call、apply、bind就像一个方法的中间件,将外部方法注入到调用者身上,再通过调用者进行调用,实现this指针的改变。
三者区别:
三者都可以改变this指针,call可以传参无数个call(this,1,2,3)
,apply只可以传一个数组,传入数组会被自动解构apply(this,[1,2,3])
=> 实质变成apply(this,1,2,3)
,bind传参像call一样,只是不能立即执行。
性能:
如果传参超过3个,call性能优于apply,参数少性能差不多。
//call实现原理
Function.prototype.myCall = function (ctx) {
ctx = ctx || window
//ctx 是传入参数a this是外部调用者b return返回的a对象身上b函数的结果值
ctx.fnn = this
console.log(ctx)//a{...}
let arg = [...arguments].slice(1)//把第一个参数删除,返回其他剩余参数。
let result = ctx.fnn(arg)//处理剩余参数
return result
}
const name = 'windowName'
let a = {
name: 'cherry',
fn: function (a, b) {
console.log(a + b)
}
}
let b = a.fn
b.myCall(a, 1, 2)