call和apply的区别和作用?那个性能会好些?

每个函数都包含两个非继承而来的方法:apply()call()
callapply都属于Function.prototype的一个方法,所以每个function实例都有callapply属性;

作用

call()方法和apply()方法的作用相同:改变this指向;一样改变 this 的还有 bind,bind并没有立即执行函数,只是预先把处理改变函数中的 this

区别

他们唯一的区别就是传参的不同:
call():第一个参数是this值没有变化,变化的是其余参数都直接传递给函数。在使用call()方法时,传递给函数的参数必须逐个列举出来。

apply():传递给函数的是参数数组

function AddFun(c, d){ 
    return this.age1 + this.age2 + c + d; 
} 
var Object = {age1:5, age2:10}; 
AddFun.call(Object, 1, 2); // 5 + 10 + 5 + 7 = 16 
AddFun.apply(Object, [10, 20]); // 1 + 3 + 10 + 20 = 34 

性能问题:

call 的性能要比 apply 好一些(尤其是传递给函数的参数超过三个的时候)

  let arr = [10, 20, 30],
  obj = { }
  function fn (x, y, z) { }
  fn.apply (obj, arr);
  fn.call (obj, ...arr);  //基于 ES6 的展开运算符也可以实现把数组中的每一项一次传递给函数