Javascript a是一个函数,那么'a.call.call'真正做什么呢?

Javascript a是一个函数,那么'a.call.call'真正做什么呢?,javascript,call,Javascript,Call,这些代码在chrome devtool上运行 似乎b.call(与a.call.call)正在调用第一个参数,这是一个函数,然后将第二个参数作为this传递。 如果第一个参数不是函数,则抛出不是函数错误 有人能解释一下.call.call是如何工作的吗?从基本的东西开始 什么是。调用?它是function.prototype中可用的函数。 因此它可以在任何函数上调用,这就是为什么您可以调用a.call 现在,.call做什么?它在您调用的函数上设置此上下文。因此,在您的情况下,当您调用a.cal

这些代码在chrome devtool上运行

似乎
b.call
(与
a.call.call
)正在调用第一个参数,这是一个函数,然后将第二个参数作为
this
传递。 如果第一个参数不是函数,则抛出
不是函数
错误


有人能解释一下
.call.call
是如何工作的吗?

从基本的东西开始

什么是
。调用
?它是
function.prototype中可用的函数。
因此它可以在任何函数上调用,这就是为什么您可以调用
a.call

现在,
.call
做什么?它在您调用的函数上设置
上下文。因此,在您的情况下,当您调用
a.call
时,它可以在函数
a
上设置
上下文(通过传递给
.call
函数的第一个参数)

.call
函数中的
这个
是什么?它只不过是您调用的函数
.call
(在您的例子中是
a
),
因此,为了简单起见,您假设在
.call
中,它可能会调用类似
this()
(这只是调用
a()
)-到目前为止还不错

回答您的问题

a.call.call
这里发生了什么?第二个
.call
(我从左到右计数)调用第一个
.call
并为第一个
设置
。call
,它只是第一个参数,是一个函数

现在,第一个
.call
将调用
this()
(请记住,这是由第二个
设置的。call
是您传递的第一个参数,这是一个函数)

我希望我能解释我想解释的

让我告诉你为什么会对
a.call.call
感到困惑。这是因为你在想我的函数
a
在这么混乱的情况下到哪里去了? 实际上,只要你调用second
。call
(这里
这个
到first
。call
来自second
。call
在这种情况下会使你的函数
a
过时)

在您的情况下,
.call.call
应该在
函数上调用。原型
对象
或任何其他函数(请记住
.call
函数的一部分。原型
可以在任何函数上调用)

所以你应该这么做

Function.prototype.call.call(...)
甚至

Object.call.call(...)
上周我对这些事情感到困惑(不是
.call.call
,而是
.call.bind
),我在这里问了一个问题,有人向我解释得非常详细,你可以找到

我试图从我的理解中回答我所问的问题

毕竟,这才是真正的意义所在

更新:

您会问“似乎b.call(与a.call.call相同)正在调用第一个参数,这是一个函数,然后将第二个参数按此方式传递。如果第一个参数不是函数,则不会抛出函数错误。”


您的假设在这里是正确的

让我给您举个例子

function a() { console.log(1) }

function b() { console.log(2) }

a.call(b)    // 1

a.call.call(b)    // 2

a.call.call.call(b)    // 2
为什么?

我们知道a.call(b)
意味着用这个
b
调用
a()

因此
a.call.call(b)
意味着调用
函数.prototype.call()
,使用这个值b,与
函数.prototype.call.call(b)
相同

但是
Function.prototype.call.call()
不是一个普通的函数对象。可以调用它,但它没有属性。有一些独特的规则来调用它

Function.prototype.call.call(a)    // 1

Function.prototype.call.call(b)    // 2
实际上,
Function.prototype.call.call(b)
是一个外来对象,而且是一个绑定函数外来对象

  • [规范]绑定函数是一个封装另一个函数对象的外来对象

  • [规范]调用绑定函数通常会导致调用其包装函数

所以
Function.prototype.call.call(a)
的意思就是
a()

call(x)
意味着调用x,也就是说,
x()

  • [规范]在
    Function.prototype.call(thisArg)
    中,如果thisArg未定义或为null,则它将被全局对象替换
a.call.call()
表示
a.call.call(未定义)
表示
a.call.call(窗口)
表示调用
window

尝试调用
窗口
您将得到
未捕获类型错误:窗口不是函数
,因此尝试调用
a.call.call()
您将得到
未捕获类型错误:a.call.call不是函数


希望能有所帮助。

a.k.a.“NullReference”尚未出现,在此之前,您的问题可能有点过于宽泛。在此之前,我会推荐其他资源,比如@jeroen我已经阅读了MDN上的文档,但这只是解释了
call
函数的工作原理,并给出了一些示例。我在这里要问的是
call.call
,它的行为与
call
不同。而且我无法获得
call.call
背后的工作。
.call()
的第一个参数是要设置为
此值的对象,该值在
call()
要操作的函数中。如果
call()
本身就是要操作的函数,因为您链接了
.call.call()
它对提供的
值有什么作用?它假定它是一个函数并尝试调用它。但最后一行代码并没有传递函数,而是传递一个空对象。S.您的
b
a
完全无关:
a
只是您设置
b
以引用
调用功能的机制的一部分。谢谢!我将阅读你的答案和链接两次到g