手写call、bind、apply
代码
1.apply
Function.prototype.myApply = function (context) {
context = context === Object(context) ? context : window
const tempFnKey = Symbol('tempFnKey')
const args = [...arguments][1] || []
context[tempFnKey] = this
console.log(typeof context[tempFnKey], context[tempFnKey])
const res = context[tempFnKey](...args)
delete context[tempFnKey]
return res
}
2.call
Function.prototype.myCall = function (context) {
context = context === Object(context) ? context : window
const tempFnKey = Symbol('tempFnKey')
const args = [...arguments].slice(1)
context[tempFnKey] = this
console.log(typeof context[tempFnKey], context[tempFnKey])
const res = context[tempFnKey](...args)
delete context[tempFnKey]
return res
}
3.bind
bind返回一个闭包(context被闭包锁定),因此bind是永久绑定,一旦绑定无法改变
Function.prototype.myBind = function (context) {
context = context || window
args = [...arguments].slice(1)
const self = this
return function () {
return self.myApply(context, args.concat([...arguments]))
}
}