JS中this关键字的思考

逆熵柯里化
• 阅读 639

JS中的this关键字,总是会让人迷惑,它究竟指向谁。在网上的学习与前辈的探讨中,有一句话让我的问题都迎刃而解:当太过绕脑的时候,可以画内存图,内存图会告诉你此时this的指向。

1.传统函数中的this

前人大牛们已经总结过无数次的话“this的指向关键看调用环境,谁调用它它就指向谁”。但话语总归是太过抽象,不如实际画一画内存图。
JS中this关键字的思考
总所周知,JS中的内存分为栈内存与堆内存,栈内存用于存放标准数据类型,但其实栈内存中的变量也存放对象,不过存放的是对象的地址。
而对象与函数等复杂数据类型都存放于堆内存当中。
说白了,JS的this就是指,谁调用这个函数,this就是谁。

2.箭头函数中的this

箭头函数有所不同,传统函数的this指调用该函数的对象,而箭头函数则永远指向调用该函数的对象的父级。
JS中this关键字的思考
上图中,sayName()函数被obj调用了,则this指的就是对象obj。
而sayNameloud()是箭头函数,箭头函数永远指向父级作用域,此时被对象obj调用,obj对象的父级对象是window,于是this.name打印出来便是张三。
值得注意的是,通过call和apply调用箭头函数时,不会改变this的指向。

3.构造函数中的this

构造函数中的this永远指向构造函数他本身。

点赞
收藏
评论区
推荐文章
Karen110 Karen110
4年前
一篇文章带你了解JavaScript this关键字
与其他语言相比,this关键字在JavaScript中的行为略有不同。JavaScript中,this关键字引用其所属的对象。根据使用位置,它具有不同的值。一、前言方法中,this关键字引用其所属的对象。1.this指的是全局对象在函数中。2.this引用全局对象在函数中。3.在严格模式下,this是未定义的在事件中。4.
九路 九路
5年前
【干货】Javascript千面之变幻莫测的this指向
相信很多前端人对“this”的指向是很懵逼的,因为this的指向总是变幻莫测,在不同的调用环境中,它的指向总是各不相同。在面试中,this也是经常考的必考题之一,很多前端老鸟经常会在this这里掉坑。接下来,看笔者来一层一层的揭开this指向的面纱。1.事件调用环境中的this指向<divclass"b
Stella981 Stella981
4年前
JavaScript中的“ new”关键字是什么?
问题:_ThenewkeywordinJavaScriptcanbequiteconfusingwhenitisfirstencountered,aspeopletendtothinkthatJavaScriptisnotanobjectorientedprogramminglanguag
Wesley13 Wesley13
4年前
Java中的native关键字
一. 什么是NativeMethod  简单地讲,一个NativeMethod就是一个java调用非java代码的接口。一个NativeMethod是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern"C"告知C++编译器去
Wesley13 Wesley13
4年前
C++基类的析构函数定义为虚函数的原因
1:每个析构函数只会清理自己的成员(成员函数前没有virtual)。2:可能是基类的指针指向派生类的对象,当析构一个指向派生类的成员的基类指针,这时程序不知道这么办,可能会造成内存的泄露,因此此时基类的析构函数要定义为虚函数;基类指针可以指向派生类的对象(多态),如果删除该指针delete\\p,就会调用该指针指向的派生类的析构函数,而派生类
Stella981 Stella981
4年前
JavaScript、ES6中类的this指向问题
<!DOCTYPEhtml<htmllang"en"<head<metacharset"UTF8"<titleDocument</title</head<body<button按钮</button<scrip
Stella981 Stella981
4年前
JS 中的this指向问题和call、apply、bind的区别
this的指向问题一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window。functiona(){console.log(this);//输出函数a中的this对象}functionb(){};varc{name:"call"}
Wesley13 Wesley13
4年前
ES6 箭头函数
一、在es6中函数的定义和es5之间有明显区别。不需要关键字function来进行定义,使用来指向函数。不可以new也就是做构造函数以及没有arguments参数。箭头函数的this是在定义的时候确定指向这和es5不一样,es5是谁调用他,他就指向谁。1document.addEventListene
Wesley13 Wesley13
4年前
MySql的数据库优化到底优啥了都??(4)
  上回刚刚讲到了BTree这次来简单学学BTree索引  BTree中每个节点包含:  1.本节点所含关键字的个数。  2.指向父节点的指针  3.关键字  4.指向子节点的指针  关于BTree的规则  1.m阶的BTree每个结点至多可以拥有m个子节点,根结点至少有两个子节点  2.根结点的关键字(key)
Stella981 Stella981
4年前
C语言中volatile关键字的学习
    volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。用volatile关键字声明的变量i每一次被访问时,执行部件都会从i相应的内存单元中取出i的值。没有用volatile关键字声明的变量i在被访问的时候可能直接从cpu的寄存器中取值(因为之前i被访问过,也就是说之前就从内存中取出i的值保存到某个寄
Wesley13 Wesley13
4年前
Java基础学习总结(9)——this关键字
一、this关键字this是一个引用,它指向自身的这个对象。看内存分析图:  假设我们在堆内存new了一个对象,在这个对象里面你想象着他有一个引用this,this指向这个对象自己,所以这就是this,这个new出来的对象名字是什么,我们不知道,不知道也没关系,因为这并不影响这个对象在内存里面的存在,这个对象只要在内存
逆熵柯里化
逆熵柯里化
Lv1
泉眼无声惜细流,树阴照水爱晴柔。小荷才露尖尖角,早有蜻蜓立上头。
文章
2
粉丝
0
获赞
0