[英]Why call to Function.apply.bind(fn, null) calls `fn.apply`, and not `Function.apply`?
假设我们有这样的代码:
let fn1 = Function.apply.bind(Math.max, null);
fn1([1, 10, 5]); // returns 10
我知道它是 ES6 中的一个spread function
,我们会这样写:
Math.max(...[1, 10, 5]);
但我无法理解Function.apply.bind
如何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])
与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
被隐式添加到“全局”方法/对象。 现在让我们重写这 2 段文字,向您展示魔法是如何工作的:)
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
函数时,将其this
关键字设置为提供的值,在调用新函数时,在任何提供的参数之前都有给定的参数序列。
因此,您bind
Function
全局对象中的apply
方法bind
到Math.max
。
因此, bind()
返回的函数fn1
等效于this.apply()
,其中this
实际上是Math.max
,正如您对bind()
方法“询问”的那样。
这一行:
let fn1 = Function.apply.bind(Math.max, null);
……真的很麻烦。 :-)它要求bind
上Function.apply
,创建将调用一个函数apply
与Math.max
为this
值和null
作为第一个参数(thisArg apply
打电话时应该使用Math.max
; Math.max
没有按”不关心this
,所以null
很好)。
当您调用fn1
,它会调用Function.apply
并将this
设置为Math.max
,并将null
作为第一个参数,然后是您传递给fn1
的数组。 apply
使用null
作为this
调用Math.max
,并将数组中的条目作为离散参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.