手撕call()前的疑问;为什么就改变this指向并且还被执行了?
首先看看this的指向问题---
this--谁调用函数,函数中的this就指向谁
var a = 'windowA';
function First() {
var a = 'FirstA';
console.log(this.a); //此时此刻函数没有调用,this没有意义
}
First() //这种形式就是window调用函数--此时First函数中的this就代表的是window;
//所以输出结果是--windowA;
既然想要改变this就是通过调用函数就能实现;但是需要注意的是一个对象是不能调用除它内部的函数的,只能调用它内部的函数;
那我们就把刚才的函数放到对象中并用对象obj进行调用;obj.First
这个就很正常吧,函数一旦被调用this才变的有意义;这个时候调用函数的是obj所以this就是对象obj,但是对象中并没有a属性,所以是undefined;-给obj添加一个属性看看
this的问题搞明白了,就来说说call--call(obj)函数就是让函数中的this代表传入的参数obj(先默认参数obj肯定是一个对象);
通过上面的认识,想让this代表obj,就是让函数在对象obj中就行(因为obj中的方法只能是obj调用)--放在对象中很简单 obj.fn = 函数体;
但是如何动态的得到函数体就是关键了;;
这里就又要强调一下this的重要性了,this是谁调用函数this就是谁;
函数function First(){} First.call();当call()被调用候,如果call中有this那么this就是First函数体;
通过这样的理解我能就能拿到上面obj.fn =函数体;中的函数体了,--就是在call()函数中进行;;
Function.prototype.call = function(obj){//首先我们先把obj通过参数的形式传入到call函数中;
obj.fn = this//此时this虽然没有意义,但是First调用它后就指Frist;
//通过上面一步我们拿到了函数体;所以我们接下来执行它
obj.fn()//到这里我们已经改变了函数体Frist中this的指向,因为obj调用了函数(this--谁调用函数this就代表谁);
到这里就是call()函数的雏形了,也是核心!!对于参数的传递也是通过call接收参数并且传入obj对象中的函数中的
}