call和apply的优缺点

在一次面试中被问到这样一个问题:
call和apply有什么优缺点?
这显然不是问它俩传递参数上面的那一点点区别,当时这个问题问的我也是一头雾水。

我自己面完下来百度了一下,大概就是说这两个有性能上的差距,说call的性能要高于apply,一些框架中也选择使用call来模拟apply,但是却没有人指出为什么会出现这样的性能差异?

有没有大神知道的啊,请指教### 问题描述

阅读 2.9k
4 个回答

确实有性能差异, 大概差5倍到8倍左右, 至于为什么的话, 个人觉得应该是底层算法实现的问题. 个人觉得不用过于纠结这个东西, 毕竟只谈性能不谈可维护性也是耍流浪啊. 比如原生的for和map这种. map虽然要慢, 但他可维护性, 写法 都好了很多.

function work(a, b, c) {
// 执行
}

var a = [1, 2, 3];

for (var j = 0; j < 4; j++) {
console.time('apply-ing');
for (var i = 0; i < 1000000; i++) {

work.apply(this, a);

}
console.timeEnd('apply-ing');

console.time('call-ing');
for (var i = 0; i < 1000000; i++) {

work.call(this, 1, 2, 3);

}
console.timeEnd('call-ing');
}

~/tmp ω  node test.js

apply-ing: 42ms
call-ing: 5ms
apply-ing: 40ms
call-ing: 5ms
apply-ing: 42ms
call-ing: 5ms
apply-ing: 39ms
call-ing: 6ms

根据楼主的问题, 我也非常感兴趣研究了一下, 代码出自:

https://jsperf.com/call-apply...

除了传递参数,没啥区别。性能应该也差不多,我记得apply就是调用的call。测试下来apply比call性能差有可能是因为要把参数封装成array。

没有优缺点,只是后面的参数格式不同,而且apply就是调用call的,中间有一个array的转化可能会消耗性能

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题