深入JavaScript之理解this指向

前言

写下这篇文章之前,先聊聊本人接触编程的顺序吧:Javascript->python->c->rust,是的,你没看错,js是我学习的第一门语言,至于原因不再多述,也不是本文重点,由于学习js之前,编程基础几乎为0的我,对于语法相较于后来学习的语言如此随意杂乱的JavaScript,学习路线可是不咋顺啊,尤为深刻的回忆里有关this指向的问题必然占有一席之地。让我们来聊聊如何理解这一块,前两年前端行业非常火爆,一些非计算机出身的人都来学习,学生体量是很大的。我相信很多纯前端方向的小伙伴跟我之前一样,都是纯小白,希望可以给你们带来学习过程当中的一些帮助。

正文

如果是之前有过C或者其他语言编程基础的人,这一块其实理解起来问题不大,至少以我现在回头看的感受是这样的。因此我建议如果是计算机方向的小伙伴最好去先修一下C,C的体系结构是专业基础,几乎所有的语言语法都借鉴于C,js也不例外,设计之初是一种客户端的脚本语言,主要应用于浏览器,就是C的衍生。如果说我只想走前端,也是不影响的,毕竟只是为了方便大家的学习,前端终究是以应用为主。开始正题:

1.this指向对象:

this是js中的一个关键字,你在常见的面向对象的语言中,几乎都会看到类似this的关键字,例如python当中的self。但是this与其相比略有不同,以前者举例,我们来看两组代码:

python 复制代码
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say_hello(self):
        print(f"你好,我是{self.name}, 我今年{self.age}岁.")

person1 = Person("苗小姐", 20)
person1.say_hello()

在python当中,我们定义了一个Person类,其中包含一个__init__方法和一个say_hello方法。我们使用self关键字来访问对象的属性,并在say_hello方法中使用self关键字来访问对象的属性。

js 复制代码
function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.sayHello = function() {
    console.log("你好,我是 " + this.name + " 我今年 " + this.age + " 岁了.");
}

var person1 = new Person("苗小姐", 20);
person1.sayHello();

在JavaScript中,我们定义了一个Person构造函数,并在其原型上定义了一个sayHello方法。在sayHello方法中,我们使用this关键字来访问对象的属性。随后使用new关键字来调用构造函数创建对象实例,并将对象的属性和方法传递给构造函数。 不难发现,在Python中,self是作为第一个参数传递给方法的,表明指代当前这个对象所以必写而在js中,this是隐式的,可以通过上下文来访问。在JavaScript中,this的指向可以根据函数的调用环境而改变,取决于函数调用的位置。见上,在对象的方法中,this指向该对象,而在函数中,this指向全局对象。这种灵活的性质在很多开发场景当中发挥了显著作用,以后会经常见到它,因此,你最好把它理解清楚。

2.this事件绑定

先来看段代码:

html 复制代码
<button id="Button">Click me</button>

<script>
var button = document.getElementById("Button");

button.addEventListener("click", function() {
    console.log(this.id); // 输出 
});
</script>

我们首先创建了一个按钮并为它附上一个id属性Button。然后,我们使用addEventListener()方法来绑定一个click事件处理程序。在这个事件处理程序中,使用this关键字来访问事件源元素的id属性,输出到控制台中。可以发现,当按钮被点击时,事件处理程序中的this指向按钮元素,因此输出的结果是"Button"。 在js中,事件绑定中的this通常指的是事件源元素的上下文。当事件发生时,js会自动将事件源元素作为this传递给事件处理程序。因此,在事件处理程序中,this指向事件源元素。

3.this固定方法

你可能会问,没有什么办法能让this指向一个我指定的对象吗?答案是肯定的,在js内置方法中有一个call方法,可以来帮助我们强制指定函数调用时this的指向,举个例子:

js 复制代码
function greet() {
    console.log("你好,我是 " + this.name);
}"
var person = {
    name: "苗小姐"
};
greet.call(person); // 输出 

后话

学海无涯,学无止境,各位掘友,鼎力前行!

相关推荐
y先森3 小时前
CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow
前端·css·css3
前端Hardy3 小时前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu10830189113 小时前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
IT女孩儿4 小时前
CSS查缺补漏(补充上一条)
前端·css
吃杠碰小鸡5 小时前
commitlint校验git提交信息
前端
虾球xz5 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇6 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒6 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员6 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐6 小时前
前端图像处理(一)
前端