复习 模拟call apply

//模拟实现
//步骤:1.将函数设为对象得属性  2.执行函数  3.删除函数 4.参数  5.null  6.返回值
Function.prototype.call2 = function(ctx){
    //获取调用call得函数,用this可以获取
    var ctx = ctx || window;
    ctx.fn = this;
    var arg = [];
    for(let i=1;i<arguments.length;i++){
        arg.push(arguments[i])
    };
    var result = eval('ctx.fn(' + args +')');
    delete ctx.fn;
    return result;
}


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

eval  计算参数 并执行   参数必须为字符串

原文地址:https://www.cnblogs.com/tutao1995/p/11654409.html