执行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]'
复制代码

 

posted @   樊顺  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示