js高级-apply()的实现

 apply()和call()/bind()的功能几乎一模一样,返回相同的结果,只在细微区域有所差别

1.三者的区别:参数的接收方式

三者第一个参数都是指向要改变的对象,但是之后的参数则有所分别

 

  • call(): 直接接收之后的参数,并用,隔开
  • apply():后续的参数存储在一个数组中,再将该数组作为参数传入 apply(obj,[arg1,arg2...])
  • bind(): 除了返回是函数以外,它的参数和call一样

2.模拟apply()的实现

  和call()模拟实现非常相似

Function.prototype.apply = function (context, arr) {
    var context = Object(context) || window;
    context.fn = this;

    var result;
//在call()的基础上增加了一次对arr该第二参数的判断
if (!arr) { result = context.fn(); } else { var args = []; for (var i = 0, len = arr.length; i < len; i++) { args.push('arr[' + i + ']'); } result = eval('context.fn(' + args + ')')
}
delete context.fn return result; } 参考
//es6 将else内容替换为 if (!(arr instanceof Array)) throw new Error('params must be array'); result = context.fn(...arr);
 

 

posted @ 2021-12-31 22:07  嗜血汽车人  阅读(179)  评论(0)    收藏  举报