先说一下普通函数中的this,普通函数中的this表示调用此函数时的对象,如下例:
var x=11; var obj={ x:22, say:function(){ console.log(this.x) } } obj.say();调用say函数的是对象obj,所以this指代对象obj,输出的就是obj对象里的x值,即22。
然后是箭头函数中的this,资料上说的箭头函数内部是没有this的,也就是说,箭头函数里面的this会继承自外部的this,下面有个例子,用来详细说明下:
var x=11; var obj={ x:22, y:this,//window say:()=>{ console.log(this.x); } } obj.say(); //输出的值为11 console.log(obj.y); //输出的值为window对象obj对象中的this指代的就是window,也就是全局环境,因为箭头函数中的this就会就近找到上一个对象中this所指代的对象,从以上例子可以看出来,obj内部属性y就为obj内部this指代的对象,输出是window。
为了加深下印象,我们再从两个例子说明下普通函数和箭头函数 this的指向问题,这是普通函数:
var a=11 function test1(){ this.a=22; let b=function(){ console.log(this.a); }; b(); } var x=new test1(); //输出11
为什么会输出11?因为普通函数中的this指向的是调用它的对象,如果没有直接调用对象,会指向undefined或者window,一般都会指向window,在严格模式下才会指向undefined。上述的例子中,并没有明确的调用对象,而普通函数中的this并不会向上继续找对象,所以直接返回window。 这是箭头函数:
var a=11; function test2(){ this.a=22; let b=()=>{console.log(this.a)} b(); } var x=new test2(); //输出22箭头函数中会往上寻找this,直到找到所代表的this为止。例子中,构造函数被实例化成为一个对象x,那x中的this指代的就是对象x本身,所以箭头函数this就代表x对象,x对象内部的a值为22,所以输出22。
再进行总结一下,箭头函数中的this是在声明中就定义好了的,而普通函数中的this则是在调用时定义好的。