关于call,apply的实现原理,只要记住this指向里面的方法调用模式就可以了,就是 哪一个对象调用了这个函数,this就指向哪个对象。
所以,我们可以把我们的修改this指向的参数作为一个对象的函数属性,通过这个对象调用它的函数属性,就可以达到改变this指向的问题。当对象上的函数方法执行后,保留其执行的返回结果,然后删除这个对象上的函数属性,最后返回保留的执行结果。这样一个bind,apply就写好了。
接下来我们来实现一下:
手撕call代码:
Function.prototype.myCall = function(context) {
if (typeof this !== "function") {
console.error("type error");
}
let args = [...arguments].slice(1),
result = null;
context = context || window;
context.fn = this;
result = context.fn(...args);
delete context.fn;
return result;
};
手撕apply代码:
Function.prototype.myApply = function(context) {
if (typeof this !== "function") {
throw new TypeError("Error");
}
let result = null;
context = context || window;
context.fn = this;
if (arguments[1]) {
result = context.fn(...arguments[1]);
} else {
result = context.fn();
}
delete context.fn;
return result;
};
小小分享,如果对您有帮助,麻烦点个赞,谢谢。
一起成长,一起进步。