call,apply,bind为改变this指向的方法
共同点:
第一个参数都为改变this的指针,若第一个参数为null或者undifined,则this指向默认window
区别:
call:第二个参数开始都是实参,使用该方法自动执行函数
apply:第二个参数是一个数组格式的参数列表,使用该方法自动执行函数
bind:第二个参数开始都是实参,该方法使用后返回一个函数,需要自己调用执行
实现call方法:
Function.prototype.myCall = function (context) {
if(context == null){
context = window;
}
context.fn = this;
const arg = [...arguments].slice(1);
const result = context.fn(...arg);
delete context.fn;
return result;
}
实现apply方法:
Function.prototype.myApply = function (context, arr) {
if(context == null) {
context = window;
}
context.fn = this;
let result;
if(arr == null){
result = context.fn();
}else {
result = context.fn(...arr);
}
delete context.fn;
return result;
}
实现bind方法:
Function.prototype.myBind = function (context) {
if(context == null){
context = window;
}
const arg = [...arguments].slice(1);
const _this = this;
return function Fn() {
if(this instanceof Fn) {
return _this.call(this, ...arg);
}
return _this.call(context, ...arg);
}
}