javascript - 为什么调用 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
它的魔力如何......
这就是我认为代码的工作方式,请在我错的地方纠正我。
- 该语句
let fn1 = Function.apply.bind(Math.max, null);
创建了一个新函数Function.apply(null)
并将this
其Math.max
分配给fn1
变量。 - 该语句
fn1([1, 10, 5]);
以这种方式调用我们新创建的函数:Function.apply(null, [1, 10, 5])
withthis
inside this function set toMath.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
被隐式添加到“全局”方法/对象中。现在让我们重写这两段文字,向您展示魔术是如何工作的 :)
- 该语句
let fn1 = Function.apply.bind(Math.max, null);
创建了一个新函数newFunction.apply(null, ...args)
,其中newFunction == Math.max
,因此它与函数相同Math.max.apply(null, ...args)
并将其分配给fn1
变量。 - 该声明
fn1([1, 10, 5]);
称newFunction.apply(null, [1, 10, 5])
魔术揭晓:)
重复更新
这个问题不是另一个问题的重复。它不同,因为它更具体,在这里我特别问“为什么调用 Function.apply.bind(fn, null) 调用fn.apply
,而不是Function.apply
?” 而不是“apply.bind 是如何工作的?”。就像在说一个问题“为什么自行车齿轮使用踏板的动觉力而不是通过加速直接产生力?” 与“自行车如何工作?”的问题相同。
解决方案
让我们把它分成几部分,首先,bind()
:
bind()方法创建一个新函数,在调用该函数时,其关键字
this
设置为提供的值,并且在调用新函数时在任何提供的参数之前具有给定的参数序列。
因此,您正在bind
将apply
方法从Function
全局对象转换为Math.max
.
fn1
因此,返回的函数bind()
等同于this.apply()
,this
实际上是Math.max
,正如您对该bind()
方法“询问”的那样。
推荐阅读
- python - 我将如何用用户所说的内容回复消息?
- python - Discord.py Discord 屏幕传输功能
- sql-server - 在 MS SQL 服务器中执行 SSIS 包
- c# - .NET MVC 模型对象的多态性
- swift - SwiftUI、Combine 和 Core Data——项目未正确映射/显示
- kotlin - 如何部分验证数据类作为函数参数?
- android - 如何检测不移动但将手指放在屏幕上的触摸事件
- c# - 如何在 Bogus (C# Faker) 规则之间共享状态?
- python-3.x - Kivy:使用按钮更新 TextInput 元素
- javascript - React Native:使用地图和索引渲染时出现问题