[JavaScript] 理解call、apply、bind原理

2019-02-27  本文已影响0人  jiansheng

Function.prototype.call()

call() 方法调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。

Function.prototype.myCall = function (thisArg, ...argArray) {
    thisArg = thisArg ? thisArg : window;
    const symbol = Symbol();
    thisArg[symbol] = this;
    const res = thisArg[symbol](...argArray);
    delete thisArg[symbol];
    return res;
};

function fn(a, b) {
    console.log(this.number, a, b);
}

const obj = {
    number: 0,
};

fn.myCall(obj, 1, 2); // 0 1 2
// 像 obj.fn(1, 2)

Function.prototype.apply()

apply() 方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。

Function.prototype.myApply = function (thisArg, argArray) {
    thisArg = thisArg ? thisArg : window;
    const symbol = Symbol();
    thisArg[symbol] = this;
    const res = thisArg[symbol](argArray);
    delete thisArg[symbol];
    return res;
};

function fn(a) {
    console.log(this.number, a);
}

const obj = {
    number: 0,
};

fn.myApply(obj, [1, 2]); // 0 [1, 2]
// 像 obj.fn([1, 2])

Function.prototype.bind()

bind()方法创建一个新的函数,在调用时设置this关键字为提供的值。并在调用新函数时,将给定参数列表作为原函数的参数序列的前若干项。

Function.prototype.myBind = function (thisArg) {
    thisArg = thisArg ? thisArg : window;
    const _this = this;
    return function () {
        const fnArgs = [...arguments];
        return _this.call(thisArg, ...fnArgs);
    }
}

function fn(a, b) {
    console.log(this.number, a, b);
}

const obj = {
    number: 0,
};

const bindFn = fn.myBind(obj);
bindFn(1, 2);
上一篇下一篇

猜你喜欢

热点阅读