call func.call(obj,args1,args2);
apply func.apply(obj,[args1,args2]);
改变this的指向,让bar()函数的this指向foo对象
var foo={
value: 100
}
function bar(){
console.log(this.value);
}
bar.apply(foo);
等同与将bar函数作为foo对象属性进行调用,即为下列方式
var foo={
value: 100
bar: function(){
console.log(this.value);
}
}
因此我们总结模拟思路如下:
1.将执行的函数作为对象属性
2.执行函数
3.将函数从对象中删除
Function.prototype.myCall=function(obj){
var obj=obj||window;
var obj.func=this;
var args=[...arguments].slice(1);
var result=obj.func(...args);
delete obj.func;
return result;
}
只是和apply传参上的实现不同
Function.prototype.myApply=function(obj){
var obj=obj||window;
var obj.func=this;
if(arguments[1]){
var result=obj.func(...arguments[1])
} else{
var result=obj.func()
}
var result=obj.func(...args);
delete obj.func;
return result;
}