call / apply函数封装实现

131 阅读1分钟
一、call函数封装实现
function call(Fn,obj,...args){
    if(obj === undefined || obj === null){
        // 全局对象
        obj = globalThis
    }
    // 为obj 添加临时方法
    obj.temp = Fn
    // 调用 temp 方法
    let result = obj.temp(...args)
    // 删除 temp 方法
    delete obj.temp
    // 返回执行结果
    return result
} 
    // 声明一个函数
    function add (a,b){
        console.log(this)
        return a + b + this.c
    }
    // 声明一个对象
    let obj = {
        c:2
    }
    window.c = 3

    // 执行call函数
    console.log(call(add,obj,10,20)) // 2+10+20
    /*
        obj不存在时 obj = 全局参数
    */
    console.log(call(add,null,10,20)) // 3+10+20
二、apply函数封装实现
function apply(Fn,obj,args){
    console.log(args)
    if(obj === undefined || obj === null){
        // 全局对象
        obj = globalThis
    }
    // 为obj 添加临时方法
    obj.temp = Fn
    // 调用 temp 方法
    let result = obj.temp(...args)
    // 删除 temp 方法
    delete obj.temp
    // 返回执行结果
    return result
} 
<script>
    // 声明一个函数
    function add (a,b){
        console.log(this)
        return a + b + this.c
    }
    // 声明一个对象
    let obj = {
        c:2
    }
    window.c = 3

    // 执行call函数
    console.log(apply(add,obj,[10,20])) // 2+10+20
    /*
        obj不存在时 obj = 全局参数
    */
    console.log(apply(add,null,[10,20])) // 3+10+20
</script>