call的作用
call最主要的作用就是改变this的指向,所有函数都能基于原型链在Function.prototype里找到call方法,所以所有函数都能直接调用call方法,如下:
函数.call(新的this指向,参数1,参数2,…)
call的第一个参数是新的this指向,其余的参数都是调用call方法的函数的实参,调用call方法的函数会被执行。
如果call方法的第一个参数是null或者undefined,在非严格模式下,thi指向window,在严格模式下,this指向null或者undefined;如果没有给call方法传递参数,那么在非严格模式下,this指向window,在严格模式下,this指向undefined。
call的原理
在做题之前需要简单了解一下call的原理,我们先来看一串代码:
function show(){
console.log(this);
}
var obj={
}
show();
此时show函数执行后,show函数里面的this指向的是window,我们要将这个this的指向改成obj的话,就需要将show函数添加到obj里面,并且通过obj调用来执行,如下:
function show(){
console.log(this);
}
var obj={
};
obj.show=show;
obj.show();
现在show函数里的this就指向obj了。
call方法的实现也是基于这个原理。
还原call方法
了解了call方法的原理之后,我们就可以自己来还原一下call方法,先写一个初级版本的,这里我用函数mycall来表示我重写的call方法:
Function.prototype.mycall = function mycall(context,...params){
context['this'] = this;//this--->show函数