call方法实现原理以及与apply、bind区别

个人理解:

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值