a是一个函数,那么`a.call.call`真的有用吗?

时间:2016-01-21 06:05:37

标签: javascript call

enter image description here

这些代码在chrome devtool上运行。

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

有人可以解释<Function>.call.call的工作原理吗?

2 个答案:

答案 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.prototypeObject或任何其他函数上调用(请记住.callFunction.prototype的一部分,可以调用任何功能)

所以你应该做完

Function.prototype.call.call(...)

甚至

Object.call.call(...)

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

我试图从我提出的问题中回答我的问题。

毕竟这是什么SO

更新:

你提问&#34;似乎b.call(与a.call.call相同)正在调用第一个参数,这是一个函数,然后传递第二个参数。如果第一个参数不是函数,则抛出函数错误。&#34;

您的假设在这里是正确的