call和apply的作用是一致的,都是在调用函数的同时,给函数绑定一个上下文context
对象,call和apply的实现都利用了调用对象内部方法时,这个方法中的this属性指向这个对象本身。比如
var obj = {
name: "lznism",
sayName() {
console.log(this.name);
}
}
obj.sayName();
call和apply唯一的不同点在于,接受参数的格式不同,其中call
接受一个一个的参数,而apply
接受一个数组作为参数
Function.prototype.myCall = function(context = window) {
if (typeof this !== "function") {
throw new Error("Only function can call this method!");
}
const args = [...arguments].slice(1);
context.fn = this;
const result = context.fn(...args);
delete context;
return result;
};
Function.prototype.myApply = function(context = window) {
if (typeof this !== "function") {
throw new Error("Only function can call this method!");
}
let result;
context.fn = this;
if (arguments[1]) {
result = context.fn(arguments[1]);
} else {
result = context.fn();
}
delete context.fn;
return result;
};
bind用来绑定函数执行过程中的this,bind使用了闭包的原理,暂时将context上下文对象存储起来。
Function.prototype.myBind = function(context = window) {
if (typeof this !== "function") {
throw new Error("Only function can call this method!");
}
const args = [...arguments].slice(1);
return function() {
return fn.apply(context, args.concat(...arguments));
};
};