一、手写call
javascript
const person = {name:'zhangsan'}
function foo(numA,numB){
console.log(this)
console.log(numA,numB)
return numA + numB
}
// 手写call
Function.prototype.mycall = function(thisArg,...args){ // 手写call
const key = Symbol('key') // 唯一标识符
thisArg[key] = this // 绑定this
const res = thisArg[key](...args) // 展开参数
delete thisArg[key] // 清除
return res
}
const res = foo.mycall(person,1,2) // thisArg = person
console.log(res)
二、手写apply
javascript
Function.prototype.myapply = function(thisArg,args){
const key = Symbol('key')
thisArg[key] = this
const res = thisArg[key](...args)
delete thisArg[key]
return res
}
const person = {name:'zhangsna'}
function foo(numA,numB){
console.log(this)
console.log(numA,numB)
return numA+numB
}
const res = foo.myapply(person,[1,2])
console.log(res)
三、手写bind
javascript
// 手写bind
Function.prototype.myBind = function(thisArg,...args){
// 返回新函数
return (...reArgs)=> this.call(thisArg,...args,...reArgs)
}
const person = {name:'zhangsan'}
function foo(numA,numB,numC,numD){
console.log(this)
console.log(numA,numB,numC,numD)
return numA + numB + numC + numD
}
const bindFunc = foo.myBind(person,1,2)
const res = bindFunc(3,4)
console.log(res)