js实现bind call apply

备忘一下,逻辑很简单,直接看代码

Function.prototype.myCall = function(context) {
    context.fn = this
    let args = [...arguments].slice(1)
    let result = context.fn(...args)
    delete context.fn
    return result
}

Function.prototype.myApply = function(context) {
    context.fn = this
    let args = arguments[1]
    let result
    if (args.length) {
        result = context.fn(...args)
    } else {
        result = context.fn()
    }
    delete context.fn
    return result
}

Function.prototype.myBind = function(context) {
    if (typeof this !== 'function') {
        throw new TypeError('Error')
    }
    let _this = this
    let args = [...arguments].slice(1)
    return function fn() {
        if (this instanceof F) {
            return _this(...args, ...arguments)
        }
        return _this.apply(context, args.concat(...arguments))
    }
}

你可能感兴趣的:(js实现bind call apply)