首页 > 解决方案 > 为什么调用 Function.apply.bind(fn, null) 调用 `fn.apply`,而不是 `Function.apply`?

问题描述

假设我们有这样的代码:

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

我知道spread function在 ES6 中我们会写:

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

但我无法理解Function.apply.bind它的魔力如何......

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

  1. 该语句let fn1 = Function.apply.bind(Math.max, null);创建了一个新函数Function.apply(null)并将thisMath.max分配给fn1变量。
  2. 该语句fn1([1, 10, 5]);以这种方式调用我们新创建的函数:Function.apply(null, [1, 10, 5])with thisinside this function set to 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 是如何工作的?”。就像在说一个问题“为什么自行车齿轮使用踏板的动觉力而不是通过加速直接产生力?” 与“自行车如何工作?”的问题相同。

标签: javascriptbindapply

解决方案


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

bind()方法创建一个新函数,在调用该函数时,其关键字this设置为提供的值,并且在调用新函数时在任何提供的参数之前具有给定的参数序列。

因此,您正在bindapply方法从Function全局对象转换为Math.max.

fn1因此,返回的函数bind()等同于this.apply()this实际上是Math.max,正如您对该bind()方法“询问”的那样。


推荐阅读