经常使用bind/ call/apply你是否想过他们是怎么实现的?
讲一下call的实现原理,
call 返回函数执行的结果
Function.prototype.call = function (context,...args){
context = context === null ? window : context;//上下文
if(!/^(object | function )$/i.test(typeof context)){
context = Object(context);
}
let result;
let key = Symbol('key');
context[key] = this;// this 代表当前方法
result = context[key](...args);
delete context[key];
return result;
思考一下bind 是如何实现的?
bind 会创建一个函数
Function.propotype.bind = function(context,...outerArgs){//outArgs bind时传入的参数
let _this = this;// 保存this,即调用bind方法的目标函数
return function(...innerArgs){// innerAtgs bind创建的函数执行时传入的参数
let args = outerArgs.concat(innerArgs);
_this.call(context,...args );
}
}
// ...args方案 代替了 Array.protptype.slice.call(arguments);