a是一个函数,那么`a.call.call`真的做了什么?
这些代码在chrome devtool上运行。
看起来好像b.call
(与a.call.call
相同)正在调用第一个参数,这是一个函数,然后将第二个参数作为this
传递。 如果第一个参数不是函数,则会抛出not a function
错误。
有人可以解释<Function>.call.call
是如何工作的吗?
让我告诉你一个例子。
3210为什么?
我们知道a.call(b)
表示调用a()
用这个值b
。
使a.call.call(b)
装置调用与Function.prototype.call()
此值b,相同Function.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()
。
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
。
希望它有帮助。
从基本的东西开始,
什么是.call
?它的一个功能在Function.prototype
之内。 因此,它可以被称为任何功能,这正是为什么你可以拨打a.call
。
现在,.call
做什么?它会在您称为.call
的功能上设置this
上下文。所以在你的情况下,当你呼叫a.call
它可以设置功能a
(通过你传递给.call
函数的第一个参数)this
上下文。
什么是this
里面的.call
函数?它只不过是你在叫.call
功能(在你的情况a
),
所以为了简单起见,你承担的.call
里面可能会调用诸如this()
功能(这只不过是调用a()
) - 到目前为止好
你的问题
a.call.call
这里发生了什么?第二个.call
(我从左到右数)首先调用.call
并设置this
为第一个.call
,这不过是第一个参数,这是一个函数。
现在第一个.call
将调用this()
(记住这是由第二个.call
设置,它是您通过的第一个参数,这是一个函数)。
我希望我能解释一下我打算解释的内容。
让我告诉你为什么你与a.call.call
混淆。这是因为你在想我的功能a
在所有这些困惑中走了哪里? 这实际上是不尽快参与的哟拨打第二.call
在你的情况下.call.call
应该被称为上Function.prototype
或Object
(这里this
首先.call
从第二.call
这使得你的函数a
过时在这种情况下推出)或任何其他功能(记住.call
是Function.prototype
一部分,可以要求任何功能)
,所以你应该做
Function.prototype.call.call(...)
甚至
Object.call.call(...)
现在我感到困惑,这些东西上周(不.call.call
但.call.bind
),我在这里问一个问题,有人就非常详细地向我解释,你可以找到它HERE
我试图回答从我问的问题的理解。
后,这一切都是那么是什么
UPDATE:
你的问题“好像b.call(同a.call.call)是调用第一个参数,这是一个函数,然后传递第二个参数,如果第一个参数不是一个函数,那么抛出一个函数错误。“
你的假设是正确这里
“[文档之王](http://meta.stackoverflow.com/q/303865/419956)”a.k.a.“NullReference”还没有出现,直到那时你的问题可能有点过于宽泛。在此之前,我会推荐其他资源,如[MDN](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/call)。 – Jeroen
@jeroen我已经阅读了关于MDN的文档,但这只是解释'call'函数的工作原理,并给出了一些示例。我在这里确切要求的是'call.call',它的行为与'call'不同。我无法获得'call.call'背后的作品。 – tjfdfs
'.call()'的第一个参数是你希望在'call()'操作的函数中设置为'this'的值。如果'call()'本身就是一个被操作的函数,因为你链接了'.call.call()'它对提供的'this'值有什么作用?它假设它是一个函数并试图调用它。但是,您的最后一行代码不会传递函数,它会传递一个空对象。 – nnnnnn