备忘一下,逻辑很简单,直接看代码
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))
}
}