美文网首页
call、apply模拟实现

call、apply模拟实现

作者: 白小纯kl | 来源:发表于2022-03-09 10:15 被阅读0次

    call模拟

    Function.prototype.call2 = function (context) {
        var context = context || window;
        context.fn = this; // 目标函数赋为对象属性
    
        // 从arguments中获取目标函数的参数
        var args = [];
        for(var i = 1, len = arguments.length; i < len; i++) {
            args.push('arguments[' + i + ']');
        }
        // call  参数平铺,拼一下
        var result = eval('context.fn(' + args +')');  // 调用对象属性
    
        delete context.fn;  // 删除对象属性
        return result; 
    }
    
    // 测试一下
    var value = 2;
    
    var obj = {
        value: 1
    }
    
    function bar(name, age) {
        console.log(this.value);
        return {
            value: this.value,
            name: name,
            age: age
        }
    }
    
    bar.call2(null); // 2
    
    console.log(bar.call2(obj, 'kevin', 18));
    // 1
    // Object {
    //    value: 1,
    //    name: 'kevin',
    //    age: 18
    // }
    

    apply模拟(类似call,参数形式不同)

    Function.prototype.apply = function (context, arr) {
        var context = Object(context) || window;
        context.fn = this;
    
        var result;
        if (!arr) {
            result = context.fn();
        } else {
            var args = [];
            for (var i = 0, len = arr.length; i < len; i++) {
                args.push('arr[' + i + ']');
            }
            result = eval('context.fn(' + args + ')')
        }
    
        delete context.fn
        return result;
    }
    

    相关文章

      网友评论

          本文标题:call、apply模拟实现

          本文链接:https://www.haomeiwen.com/subject/ffktdrtx.html