首页 > 语言 > JavaScript > 正文

JavaScript中this的学习笔记及用法整理

2024-05-06 15:44:34
字体:
来源:转载
供稿:网友

很多人可能会有疑问,this到底是什么?为什么this的值变化多端?

首先我们来概括下this.

this是一个对象,一般存在于函数中,表示当前函数的执行上下文;

值得一提的是,当函数在执行后,this才有绑定的对象,函数未执行时,this没有内容

普通函数

普通函数中的this,普通函数中的this表示调用此函数时的对象,如下例:

var x=11;var obj={ x:22, say:function(){  console.log(this.x) }}obj.say();//console.log输出的是22//调用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();//输出的值为11console.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值 所以

function Person() {   this.age = 0;   setInterval(() => {    // 回调里面的 `this` 变量就指向了期望的那个对象了    this.age++;  }, 3000);}var p = new Person();

两个例子加深印象

普通函数

var a=11function 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。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选