gpt4 book ai didi

javascript - 为什么调用 Function.apply.bind(fn, null) 调用 `fn.apply` 而不是 `Function.apply` ?

转载 作者:行者123 更新时间:2023-11-29 23:16:48 30 4
gpt4 key购买 nike

假设我们有这样的代码:

let fn1 = Function.apply.bind(Math.max, null);
fn1([1, 10, 5]); // returns 10

我知道它是 ES6 中的一个展开函数,我们会这样写:

Math.max(...[1, 10, 5]);

但我不明白 Function.apply.bind 是如何发挥它的魔力的……

这就是我认为代码的工作方式,请纠正我错误的地方。

  1. 这条语句 let fn1 = Function.apply.bind(Math.max, null); 使用 this 创建一个新函数 Function.apply(null) 设置为 Math.max 并将其分配给 fn1 变量。
  2. 此语句 fn1([1, 10, 5]); 以这种方式调用我们新创建的函数:Function.apply(null, [1, 10, 5]) 并将此函数内的 this 设置为 Math.max。但是这个调用是无效的...如果我们在 JS 控制台中复制/粘贴该行 - 我们将得到 Uncaught SyntaxError: Unexpected number

所以,我的问题是 - Function.apply 如何知道它应该使用 this 等于 Math.max 和“旋转”/修改它对 Math.max.apply 的调用?

已更新

我刚刚了解所有这些东西是如何工作的!首先,让我们将代码重写为它的“真实”形式:

let fn1 = this.Function.apply.bind(Math.max, null);
this.fn1([1, 10, 5]); // returns 10

魔法? this 被隐式添加到“全局”方法/对象。现在让我们重写这两段文字,向您展示魔法是如何工作的:)

  1. 这条语句 let fn1 = Function.apply.bind(Math.max, null); 创建了一个新函数 newFunction.apply(null, ...args) ,其中 newFunction == Math.max,因此它与函数 Math.max.apply(null, ...args) 相同并将其分配给 fn1 变量。
  2. 这条语句 fn1([1, 10, 5]); 调用 newFunction.apply(null, [1, 10, 5])

魔法揭晓:)

重复更新

这个问题不是另一个问题的重复。它是不同的,因为它更具体,在这里我特别问“为什么调用 Function.apply.bind(fn, null) 调用 fn.apply,而不是 Function.apply ?”而不是“apply.bind 是如何工作的?”。这就好比说一个问题“为什么自行车变速是利用踏板的动觉力,而不是直接通过加速产生力?”与“自行车如何工作?”的问题相同。

最佳答案

让我们把它分成几部分,首先,bind() :

The bind() method creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.

因此,您正在将 Function 全局对象中的 apply 方法绑定(bind)Math.max

bind() 返回的函数 fn1 因此等同于 this.apply(),其中 this 确实是 Math.max,正如您“询问”bind() 方法一样。

关于javascript - 为什么调用 Function.apply.bind(fn, null) 调用 `fn.apply` 而不是 `Function.apply` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52459422/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com