call | apply | bind | ||||
用法 | function.call(thisArg,arg1,arg2,arg3...) | |||||
功能 | 使用一个指定的this值和单独给出的一个或者多个参数来调用一个函数。 | 创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列 | ||||
返回值 | 使用调用者提供的this值和参数调用该函数的返回值,若方法无返回值,返回undefined。 | |||||
注意点 |
1.this可以传null或者undefined,此时this指向window; 2.this参数可以传基本数据类型,原生call会自动用Object()转换; 3.函数是可以有返回值的; 4.将函数添加到指定对象中,用delete删除(消除副作用) |
整体与call类似,apply调用的时候,第二个参数是个数组 | ||||
步骤 |
1.获取第一个参数,构建对象 2.将对应函数传入该对象 3.获取参数并执行相应函数 4.删除该对象中的函数,消除副作用 5返回结果 |
1、将函数设置为对象的属性; 2、处理传入的参数; 3、返回函数的定义/引用; 4、外层执行接收的函数; 5、删除对象上第一步设置的函数; |
1.call函数
Function.prototype.myCall = function(){ let target = arguments[0]|| window || global target.fn = this let args = Array.from(arguments).slice(1) let result = target.fn(...args) delete target.fn return result }
2.apply函数
Function.prototype.myApply = function(){ let target = arguments[0]|| window || global target.fn = this let args = Array.from(arguments)[1] let result = target.fn(...args) delete target.fn return result }
3.bind函数
Function.prototype.myBind = function(context) { const _this = this const args = [...arguments].slice(1) console.log(this) // 返回一个函数 return function F() { // 因为返回了一个函数,我们可以 new F(),所以需要判断 if (this instanceof F) { // 忽略传入的this return new _this(...args, ...arguments) } // 直接调用,将两边的参数拼接起来 return _this.apply(context, args.concat(...arguments)) } }
分类:
前端 / js手写案例
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程