模拟实现call, apply和bind函数
2020-05-03 本文已影响0人
风雅欢乐
可以从以下几点来考虑如何实现
- 第一个参数context如果没有传递, 默认为window
- 改变this指向, 让context可以执行该函数, 那么可以给context添加一个函数, 执行完成后删除
模拟实现call
Function.prototype.myCall = function (context, ...args) {
const context = context || window;
// 给context添加一个属性, 指向该函数
context.fn = this;
const result = context.fn(...args);
// 执行完毕, 删除添加的函数
delete context.fn;
return result;
}
模拟实现apply
Function.prototype.myApply = function(context, argsArray) {
const context = context || window;
context.fn = this;
let result;
if (argsArray) {
result = context.fn(...argsArray);
} else {
result = context.fn();
}
delete context.fn;
return result;
}
模拟实现bind函数
Function.prototype.myBind = function (context, ...args) {
if (typeof this!== 'function') {
throw new TypeError('myBind can only be called by a function');
}
const that = this;
return function (...argsInner) {
return that.apply(context, args.concat(argsInner));
}
}