call和apply

相同点:

作用都是为了改变函数运行时上下文而存在的。
即改变函数体内部this的指向。
"说白点,a有xx方法,b没有。b可以问a借!"

不同点:

接受参数方式不一样。

call接受的是连续参数,apply接受的是数组参数。
A.call(this, a,b,c,d)
A.apply(this, [a,b,c,d])

继承使用:

通过call和apply,我们可以实现对象继承

var Parent = function(){
    this.name = "xsf";
    this.age = 22;
}

var child = {};
Parent.call(child);          // child向Parent借
console.log(child);

调用父构造函数:

apply

var arr1 = [1,2];
var arr2 = [3,4];
Array.prototype.push.apply(arr1,arr2);  // [1,2,3,4]

把arr2 push进arr1

相当于:

arr2.forEach(function(value){
  arr1.push(value);
)

call

var arr1 = [1,2];
var arr2 = [3,4];
var arr3 = [2,4];
Array.prototype.push.call(arr1,arr3,arr3); // [1,2,[3,4],[2,4]]不会拆分数组元素

非常实用的小技巧

求数组中的最大最小值,var arr = [22,3,24,54,65];

Math.max.apply(null, arr); // 65
Math.min.apply(null, arr); // 3

call就不行了,以上利用了apply的传参特性!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容