为什么.call和.apply比JavaScript中的直接函数调用慢?

为什么.call和.apply比JavaScript中的直接函数调用慢?,javascript,performance,Javascript,Performance,我很好奇。它们似乎表明,直接函数调用要比使用.call或或

我很好奇。它们似乎表明,直接函数调用要比使用
.call
调用的相同函数快得多。(调用
.call
.apply
之间的差异让我更加惊讶。)你能解释一下这些结果吗


更新:有人离开了测试。在不进行第二次数组实例化的情况下应用。

我想原因可能取决于运行代码的解释器,但正常函数调用似乎更快,因为解释器可以使用内联缓存访问属性


您可以查看更多信息。

首先,至少还涉及一个函数调用(对“.call()”或“.apply()”的调用)。。。。。。事实上,通过“.call()”或“.apply()”的速度大约是原来的一半,这与您预期的两个函数调用而不是一个函数调用的成本差不多。
.apply的速度较慢,因为您也在构造数组。@Pointy这是一个不错的经验解释,除了,
function.call()
obj.func()
应与
[[Call]]
的内部调用相同。因此,无论哪种方式都应该只有一次呼叫。在
iPad
中,
apply
call
的性能是相同的。如果您运行此[test][1],您会注意到。call与普通呼叫一样快,可能是因为当数组包含不同类型的值时,解释器很难进行类型推断……您所说的“解释器可以使用内联缓存访问属性”是什么意思:什么属性?我指的是对象属性。在javascript中调用obj.myProp时,解释器需要遍历对象中的所有属性,以检查哪个属性对应于“myProp”。一种可能的优化方法是在对象属性列表中“记住”该属性的索引,并在下一次函数调用时直接跳转到此属性。到的链接是brokenyes,现在似乎已断开。我模模糊糊地记得它指向大卫·曼德林的演讲。从链接名称中,您可能可以在此处找到相同的材料:(此链接的pdf文件与答案相关)。