我最近观看了一段视频,其中老师演示了javascript代码
alert.call.apply(function(a) {return a}, [1,2])
结果总是在" 2"。所以这是我的问题:为什么?
我找不到任何有关返回此结果的原因。
答案 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
分配给2
(1
未在函数中使用未绑定)。所以这将始终返回2
,因为它只是返回列表中的第二项。
但是alert
的作用是什么,为什么我们可以替换那里的任何函数名称?好吧,似乎在所有原型之间共享一个call()
函数。您可以通过运行
alert.call === console.log.call
true
因此,如果我们使用alert
,console.log
或什么都没有,那么我们总是使用相同的call()
函数。