执行x.call.call发生了什么(JS)
call方法(Function.prototype.call)是用来改变某个方法被调用时的this指向。
官方描述:使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。
首先,call的常规用法(如下):
const obj = { name: 'test-object', }; function helper() { console.log('output'); console.log(this); console.log('name: ', this?.name); console.log('args: ', arguments); } helper.call(obj, 0, 1, 2);
然后,我们回到主题,看看 x.call.....call 这种用法,该如何理解。
直接看下方代码吧(特别是注释部分)
function foo() { console.log('foo -> this: ', this); } function fake() { console.log('fake -> this: ', this); } /** * 1. foo.call(fake) 性质过程描述 * 其等同于: * const key = Symbol('foo'); * fake[key] = foo; * fake[key](); * delete fake[key]; */ /** * 2. foo.call.call 可以将其理解为: * const call = foo.call; * 因为 foo.call === Function.prototype.call, * 所以 call === Function.prototype.call。 * 故, * call.call(fake, true); * 等同于(参考 1): * fake.call(true); * 所以,最后的输出为:'fake -> this: [Boolean: true]' */ foo.call.call(fake, true); // output: 'fake -> this: [Boolean: true]'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?