为什么会这样?

时间:2018-04-01 02:36:37

标签: javascript return

我最近观看了一段视频,其中老师演示了javascript代码

alert.call.apply(function(a) {return a}, [1,2])

结果总是在" 2"。所以这是我的问题:为什么?

我找不到任何有关返回此结果的原因。

1 个答案:

答案 0 :(得分:2)

这段代码太聪明了! 但是等一下,下面的代码会产生相同的结果:

console.log.call.apply(function(a) {return a}, [1,2])

以下是发生的事情:apply()的第一个参数是' this',第二个参数是参数列表。然后它使用这些参数调用函数console.log.call,这在逻辑上等同于:

(function(a) {return a}).call(1,2)

此代码产生相同的结果,并且更容易理解 - 我们在未命名的函数上使用call()call()的参数是&{39; this'对象后跟参数。在这种情况下,this'是1,参数是2,因此调用该函数时a分配给21未在函数中使用未绑定)。所以这将始终返回2,因为它只是返回列表中的第二项。

但是alert的作用是什么,为什么我们可以替换那里的任何函数名称?好吧,似乎在所有原型之间共享一个call()函数。您可以通过运行

来验证该假设
alert.call === console.log.call
true

因此,如果我们使用alertconsole.log或什么都没有,那么我们总是使用相同的call()函数。