call
Function.prototype.call(this, arg1, arg2, …..) 可以改变 this,并且传入参数,立刻执行,返回函数返回值
手写 call
Function.prototype.myCall = function(context = window, …args) {
context = context || window; // 参数默认值并不会排除 null,所以重新赋值
context.fn = this; // this 是调用 call 的函数
const result = context.fn(…args);
delete context.fn; // 执行后删除新增属性
return result;
}
apply
Function.prototype.apply(this, [arg1, arg2, …..]) 可以改变 this,并且传入参数,与 call 不同的是,传入的参数是数组或类数组,立刻执行,返回函数返回值
手写 apply:
Function.prototype.myApply = function(context = window, args = []) {
context = context || window; // 参数默认值并不会排除 null,所以重新赋值
context.fn = this; // this 是调用 call 的函数
const result = context.fn(…args);
delete context.fn;
return result;
}
bind
Function.prototype.bind(this, arg1, arg2, …) 可以绑定 this,并且传入参数,方式与 call 相同,但是不会执行,返回已绑定 this 的新函数
手写 bind:
Function.prototype.myBind = function(context, …args) {
const _this = this;
return function Bind(…newArgs) {
// 考虑是否此函数被继承
if (this instanceof Bind) {
return _this.myApply(this, […args, …newArgs])
}
return _this.myApply(context, […args, …newArgs])
}
}