每个函数都包含两个非继承而来的方法:
apply()
和call()
call
与apply
都属于Function.prototype
的一个方法,所以每个function
实例都有call
、apply
属性;
作用
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 的展开运算符也可以实现把数组中的每一项一次传递给函数
网友评论