JavaScript中this的学习笔记及用法整理
很多人可能会有疑问,this到底是什么?为什么this的值变化多端?
首先我们来概括下this.
this是一个对象,一般存在于函数中,表示当前函数的执行上下文;
值得一提的是,当函数在执行后,this才有绑定的对象,函数未执行时,this没有内容
普通函数
普通函数中的this,普通函数中的this表示调用此函数时的对象,如下例:
varx=11; varobj={ x:22, say:function(){ console.log(this.x) } } obj.say(); //console.log输出的是22 //调用say函数的是对象obj,所以this指代对象obj,输出的就是obj对象里的x值,即22。
箭头函数
箭头函数中的this,资料上说的箭头函数内部是没有this的,也就是说,箭头函数里面的this会继承自外部的this,下面有个例子,用来详细说明下:
varx=11; varobj={ 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,它会捕获其所在(即定义的位置)上下文的this值,作为自己的this值,
1、所以call()/apply()/bind()方法对于箭头函数来说只是传入参数,对它的this毫无影响。
2、考虑到this是词法层面上的,严格模式中与this相关的规则都将被忽略。(可以忽略是否在严格模式下的影响)
因为箭头函数可以捕获其所在上下文的this值所以
functionPerson(){ this.age=0; setInterval(()=>{ //回调里面的`this`变量就指向了期望的那个对象了 this.age++; },3000); } varp=newPerson();
两个例子加深印象
普通函数
vara=11 functiontest1(){ this.a=22; letb=function(){ console.log(this.a); }; b(); } varx=newtest1(); //输出11
为什么会输出11?因为普通函数中的this指向的是调用它的对象,如果没有直接调用对象,会指向undefined或者window,一般都会指向window,在严格模式下才会指向undefined。上述的例子中,并没有明确的调用对象,而普通函数中的this并不会向上继续找对象,所以直接返回window。
箭头函数
vara=11; functiontest2(){ this.a=22; letb=()=>{console.log(this.a)} b(); } varx=newtest2(); //输出22
箭头函数中会往上寻找this,直到找到所代表的this为止。例子中,构造函数被实例化成为一个对象x,那x中的this指代的就是对象x本身,所以箭头函数this就代表x对象,x对象内部的a值为22,所以输出22。
总结
1、箭头函数中的this是在声明中就定义好了的,而普通函数中的this则是在调用时定义好的。
2、箭头函数不绑定this,它会捕获其所在(即定义的位置)上下文的this值,作为自己的this值。正是因为它没有this,所以也就不能用作构造函数。,
3、若想改变this指向可以用bind方法。bind方法在ES5引入,在Function的原型链上,Function.prototype.bind。通过bind方法绑定后,函数将被永远绑定在其第一个参数对象上,而无论其在什么情况下被调用。
以上就是毛票票小编整理的全部相关知识点,希望能够帮助到大家。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。