2016-01-21 92 views
8

enter image description herea是一个函数,那么`a.call.call`真的做了什么?

这些代码在chrome devtool上运行。

看起来好像b.call(与a.call.call相同)正在调用第一个参数,这是一个函数,然后将第二个参数作为this传递。 如果第一个参数不是函数,则会抛出not a function错误。

有人可以解释<Function>.call.call是如何工作的吗?

+0

“[文档之王](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

+0

@jeroen我已经阅读了关于MDN的文档,但这只是解释'call'函数的工作原理,并给出了一些示例。我在这里确切要求的是'call.call',它的行为与'call'不同。我无法获得'call.call'背后的作品。 – tjfdfs

+1

'.call()'的第一个参数是你希望在'call()'操作的函数中设置为'this'的值。如果'call()'本身就是一个被操作的函数,因为你链接了'.call.call()'它对提供的'this'值有什么作用?它假设它是一个函数并试图调用它。但是,您的最后一行代码不会传递函数,它会传递一个空对象。 – nnnnnn

回答

8

让我告诉你一个例子。

​​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

希望它有帮助。

1

从基本的东西开始,

什么是.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.prototypeObject(这里this首先.call从第二.call这使得你的函数a过时在这种情况下推出)或任何其他功能(记住.callFunction.prototype一部分,可以要求任何功能)

,所以你应该做

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

甚至

Object.call.call(...) 

现在我感到困惑,这些东西上周(不.call.call.call.bind),我在这里问一个问题,有人就非常详细地向我解释,你可以找到它HERE

我试图回答从我问的问题的理解。

后,这一切都是那么是什么

UPDATE:

你的问题“好像b.call(同a.call.call)是调用第一个参数,这是一个函数,然后传递第二个参数,如果第一个参数不是一个函数,那么抛出一个函数错误。“

你的假设是正确这里

+0

谢谢!我会阅读你的答案和两次链接以获得一些想法。 – tjfdfs

+0

和你的假设是正确的,我更新了我的答案,以捕获该问题 – Oxi

+0

请将此与易于理解的示例联系起来。 –

相关问题