这些代码在chrome devtool上运行。
似乎b.call
(与a.call.call
相同)调用第一个参数,即函数,然后将第二个参数传递为this
。
如果第一个参数不是函数,则抛出not a function
错误。
有人可以解释<Function>.call.call
的工作原理吗?
答案 0 :(得分:9)
让我举个例子。
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)
表示使用此值a()
调用b
。
因此a.call.call(b)
表示使用此值b调用Function.prototype.call()
,与Function.prototype.call.call(b)
相同。
但是Function.prototype.call.call()
不是普通的函数Object。它可以被调用,但它没有属性。有一些唯一规则来调用它。
Function.prototype.call.call(a) // 1
Function.prototype.call.call(b) // 2
事实上,Function.prototype.call.call(b)
是一个异域对象,而且是一个绑定函数异域对象。
[规格]绑定函数是包装另一个函数对象的异域对象。
[规范]调用绑定函数通常会调用其包装函数。
因此Function.prototype.call.call(a)
仅表示a()
。
a.call.call(x)
表示调用x,即x()
。
Function.prototype.call(thisArg)
中,如果thisArg未定义或为null,则它将被全局对象替换。 a.call.call()
表示a.call.call(undefined)
表示a.call.call(window)
表示调用window
。
尝试调用window
您将获得Uncaught TypeError: window is not a function
,因此请尝试调用a.call.call()
您将获得Uncaught TypeError: a.call.call is not a function
。
希望它有所帮助。
答案 1 :(得分:1)
从基本内容开始,
什么是.call
?它是Function.prototype
内的一个功能。
因此可以在任何函数上调用它,这正是您能够调用a.call
。
现在,.call
做了什么?它在您调用this
的函数上设置.call
上下文。所以在您的情况下,当您致电a.call
时,它可以在函数this
上设置a
上下文(通过传递给.call
函数的第一个参数)。
this
函数中的.call
是什么?它只是你打电话.call
的功能(在你的情况下是a
),
所以为了简单起见,你可以假设,在.call
内,它可能会调用像this()
这样的函数
(这只是呼唤a()
) - 到目前为止一直很好
问题
a.call.call
这里发生了什么?第二个.call
(我从左到右计算)首先调用.call
并为第一个this
设置.call
,这只是第一个参数,即功能
现在首先.call
将调用this()
(请记住这是由第二个.call
设置的,它是您传递的第一个参数,这是一个函数。)
我希望,我能解释一下我打算解释的内容。
让我告诉你为何与a.call.call
混淆。这是因为你在想我的功能a
在哪里出现了这种混乱?
实际上不会涉及第二个.call
(此处this
到第一个.call
)来自第二个.call
,这会使您的函数a
过时这个案例)
在你的案例中.call.call
应该在Function.prototype
或Object
或任何其他函数上调用(请记住.call
是Function.prototype
的一部分,可以调用任何功能)
所以你应该做完
Function.prototype.call.call(...)
甚至
Object.call.call(...)
现在我上周对这些事情感到困惑(不是.call.call
而是.call.bind
),我在这里问了一个问题,并且有人非常详细地向我解释了,你可以找到它{{3 }}
我试图从我提出的问题中回答我的问题。
毕竟这是什么SO
更新:
你提问&#34;似乎b.call(与a.call.call相同)正在调用第一个参数,这是一个函数,然后传递第二个参数。如果第一个参数不是函数,则抛出函数错误。&#34;
您的假设在这里是正确的