开发者社区> 问答> 正文

call 和 apply 的区别是什么,哪个性能更好一些?#前端面试

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

展开
收起
Bill 2020-05-23 13:52:47 2850 0
1 条回答
写回答
取消 提交回答
  • 领取2折优惠劵,有几率免单哦!http://www.weilai.info/tool/326.html

    apply 方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。 call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组。

    • Function.prototype.apply和Function.prototype.call 的作用是一样的,区别在于传入参数的不同;
    • 第一个参数都是,指定函数体内this的指向;
    • 第二个参数开始不同,apply是传入带下标的集合,数组或者类数组,apply把它传给函数作为参数,call从第二个开始传入的参数是不固定的,都会传给函数作为参数。
    • call比apply的性能要好,平常可以多用call, call传入参数的格式正是内部所需要的格式,

    性能问题,出处:https://github.com/noneven/__/issues/6

    以前看jQuery源码的时候有看到在源码的注释中有些过call的性能会比apply好,在lodash的源码中也同样的发现有call比apply性能更好的注释。这里我在jsperf上写了几个test case,验证了一下确实call比apply的性能更好。

    1. lodash源码apply方法重写
    2. 无指向无参数对比:
    3. 有指向无参数对比:
    4. 无参数有指向:
    5. 有参数有指向对比:

    总结: 在我们平时的开发中其实不必关注call和apply的性能问题,但是可以尽可能的去用call,特别是es6的reset解构的支持,call基本可以代替apply,可以看出lodash源码里面并没有直接用Function.prototype.apply,而是在参数较少(1-3)个时采用call的方式调用(因为lodash里面没有超过4个参数的方法,PS如果一个函数的设计超过4个入参,那么这个函数就要考虑重构了)

    2020-05-24 11:49:28
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Vue.js 在前端服务化上的探索与实践 立即下载
阿里文娱大前端技术实践 立即下载
前端代码是怎样智能生成的 立即下载