手写call、apply、bind

一、手写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)
相关推荐
lichenyang4534 分钟前
Vue状态管理工具pinia的使用以及Vue组件通讯
前端
腹黑天蝎座5 分钟前
如何更好的封装一个接口轮询?
前端·react.js
AlenLi5 分钟前
JavaScript - 观察者模式的实现与应用场景
前端·设计模式
siroi8 分钟前
【nginx】NJS 的简单实践
前端
饮水机战神10 分钟前
震惊!多核性能反降11%?node接口压力测试出乎意料!
前端·node.js
一只叁木Meow11 分钟前
JavaScript数学库深度对比
前端
顾辰逸you13 分钟前
uniapp--咸虾米壁纸项目(一)
前端·微信小程序
方方洛27 分钟前
电子书阅读器:epub电子书文件的解析
前端·产品·电子书
idaibin28 分钟前
Rustzen Admin 前端简单权限系统设计与实现
前端·react.js
GISer_Jinger34 分钟前
Trae Solo模式生成一个旅行足迹App
前端·javascript