相同点:都是为了改变this的指向
call 和 apply 都是 function 原型上的方法,而每一个函数作为 function 一个实例,所以可以调取原型上的 call 和 apply 方法。
不同点:传参的类别不同
call 第二个参数开始接受一个参数列表
apply第二个参数开始接受一个参数数组
toString.call([],1,2,3);
toString.apply([],[1,2,3]);
let array = [1,2,3], obj = {};
function fun(a,b,c){}
//a = 1,b = 2,c = 3
fun.apply(obj,array);
//a = [1,2,3] b = c = undefined
fun.call(obj,array);
//ES6的展开运算符,这时a = 1,b = 2,c = 3
fun.call(obj,...array);
类似功能的方法还有一个 bind ,但是 bind 没有把函数立即执行,而是预先处理改变this
哪个性能会好一点
参数在三个以内,call 和 apply 的性能差不多,
参数超过三个,call 的性能要比 apply 的好一点
性能测试,很多工具都可以测出一段代码的性能和效果
自己也可以简单的测试一下性能,但是因为cpu、内存等电脑当前性能不会一直不变,所以测出来的性能会有差别。
如果想要测试一段代码的执行时间
1. 可以在代码执行之前获取一下当前之间,执行之后获取一个时间,两者相减得到运行代码的时间
2.console 有个方法,console.time()可以监控时间,
console.time('ti');
// 想要测时间的代码
console.timeEnd('ti');
3. 在火狐浏览器上可以先安装FireBug,使用console.profile(),可以更精准的获取当前时间