# ❓ call 和 apply 的区别是什么,哪个性能更好一些

两者的作用是相同的。

  • 第一个参数都是,指定函数体内 this 的指向

  • 第二个参数开始不同 apply 是传入带下标的集合,数组或者类数组,apply 把它传给函数作为参数,call 从第二个开始传入的参数是不固定的,都会传给函数作为参数。

call 的性能是比 apply 的性能要好一些的

apply 多了 CreateListFromArrayLike 的调用,其他的操作几乎是一样的(甚至 apply 仍然多了点操作)。从草案的算法描述来看,call 性能 > apply 性能。

https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/84#issuecomment-599313971

尤其是 ES6 引入了 Spread operator (延展操作符) 后,即使参数是数组,可以使用 call

let params = [1, 2, 3, 4]
xx.call(obj, ...params)
1
2

在我们平时的开发中可以尽可能的去用 call,特别是 ES6 的 reset 解构的支持,call 基本可以代替 apply

lodash 源码里面并没有直接用 Function.prototype.apply,而是在参数较少(1-3)个时采用 call 的方式调用

lodash 里面没有超过 4 个参数的方法,PS 如果一个函数的设计超过 4 个入参,那么这个函数就要考虑重构的问题了。