前端面试之修改this指向

2021-04-25  本文已影响0人  Splendid飞羽

第一种:使用call方法 注意arguments对象的参数形式


function bindThis(f, oTarget) {
    let args = [].slice.call(arguments)
    return function () {
        return f.call(oTarget, ...args)
    }
} 
//

第二种:使用apply方法

function bindThis(f, oTarget) {
    return function () {
        let args = [].slice.call(arguments)
        return f.apply(oTarget, args)
    }
} 

第三种:bind方法 直接绑定this指向

function bindThis(f, oTarget) {
    return f.bind(oTarget)
}

第四种:将函数作为对象的方法调用

function bindThis(f, oTarget) {
    // 使用call、apply、bind方法时,该函数是添加到对象原型上的
    // oTarget.__proto__.fn = f
    oTarget.fn = f
    return function () {
        let args = [].slice.call(arguments)
        return oTarget.fn(...args)
    }
}

考察点:call,apply和bind的作用和区别?
相同点:1:都能改变this指向
2:都能传递参数
3:都能通过方法"."方法名调用
不同点:1:函数名不同
参数传递方式不同(注意看第二个)
改变this指向的时机不同(bind在复制时改变,其他两个在调用时改变)
参数传递时机不同(注意看第三个)

上一篇 下一篇

猜你喜欢

热点阅读