bind/apply/call

bind

Function.prototype.bind2 = function(context) {
    let _this = this;
    let argsParent = Array.prototype.slice.call(arguments, 1);
    return function() {
        var args = argsParent.concat(Array.prototype.slice.call(arguments)); // 转化成数组
        _this.apply(context, args);
    };
}

apply

Function.prototype.apply2 = function(context, arr) {
    let context = context || window; // 因为传进来的context有可能是null
    context.fn = this;
    let args = [];
    let params = arr || [];
    for (var i = 0; i < params.length; i++) {
        args.push("params[" + i + "]"); // 不这么做的话 字符串的引号会被自动去掉 变成了变量 导致报错
    }
    args = args.join(",");

    let result = eval("context.fn(" + args + ")"); // 相当于执行了context.fn(arguments[1], arguments[2]);

    delete context.fn;
    return result; // 因为有可能this函数会有返回值return
}

call

Function.prototype.call2 = function(context) {
    let context = context || window; // 因为传进来的context有可能是null
    context.fn = this;
    let args = [];
    for (var i = 1; i < arguments.length; i++) {
        args.push("arguments[" + i + "]"); // 不这么做的话 字符串的引号会被自动去掉 变成了变量 导致报错
    }
    args = args.join(",");

    let result = eval("context.fn(" + args + ")"); // 相当于执行了context.fn(arguments[1], arguments[2]);

    delete context.fn;
    return result; // 因为有可能this函数会有返回值return
}

Last updated