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);