call、apply、bind 作用是改变函数执行时的上下文,简而言之就是改变函数运行时的 this 指向
区别
apply
apply 接受两个参数,第一个参数是 this 的指向,第二个参数是函数接受的参数,以数组的形式传改变 this 指向后原函数会立即执行,且此方法只是临时改变 this 指向一次
当第一个参数为 null、undefined 的时候,默认指向 window(在浏览器中)
call
call 方法的第一个参数也是 this 的指向,后面传入的是一个参数列表
跟 apply 一样,改变 this 指向后原函数会立即执行,且此方法只是临时改变 this 指向一次
同样的,当第一个参数为 null、undefined 的时候,默认指向 window(在浏览器中)
bind
bind方法和cal很相似,第一参数也是 this 的指向,后面传入的也是一个参数列表(但是这个参数列表可以分多次传入)
改变 this 指向后不会立即执行,而是返回一个永久改变 this 指向的函数
当然的,当第一个参数为 null、undefined 的时候,默认指向 window(在浏览器中)
不难看出三者之间的异同
- apply、call、bind 都能起到改变函数的 this 对象指向的作用,且当第一个参数为 null,undefined 时,默认指向 window;但 bind 可以起到永久修改的作用
- 三者都可以传参,但是 apply是数组,而call是参数列表,且apply和call 是一次性传入参数,而 bind 可以分为多次传入
bind 实现
Function.prototype.recodeBind = function (context) { if (typeof (context) !== 'function') { throw new TypeError('recodeBind needs to be a function'); } const args = [...arguments].slice(1) const fn = this return function Fn() { return fn.apply(this instanceof Fn ? new Fn(...arguments) : context, args.concat(...arguments)) } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类