揭开`this`的神秘面纱:探索 JavaScript 中的上下文密钥(上)

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 一、引言
    • 介绍`this`关键字在 JavaScript 中的重要性。
  • 二、`this`的基本概念
    • 解释`this`的定义和作用。
  • 三、不同的绑定方式
    • 介绍`this`的四种绑定方式:默认绑定、隐式绑定、显式绑定和 new 绑定。

一、引言

介绍this关键字在 JavaScript 中的重要性。

this 关键字在 JavaScript 中具有非常重要的作用,它用于表示当前执行上下文对象,即当前函数所在的对象

this 关键字可以用来访问对象的属性和方法,以及调用对象的方法和访问对象的属性。

this 关键字在 JavaScript 中具有以下重要性:

  1. 确定当前对象的属性:在 JavaScript 中,可以使用 this 关键字来访问对象的属性。例如,this.name 可以用来访问对象的 name 属性。

  2. 调用对象的方法:在 JavaScript 中,可以使用 this 关键字来调用对象的的方法。例如,this.sayHello() 可以用来调用对象的 sayHello 方法。

  3. 访问原型链上的属性和方法:JavaScript 中每个对象都有一个原型链,可以通过 this 关键字访问原型链上的属性和方法。例如,this.prototype.age 可以用来访问原型链上的 age 属性。

  4. 避免全局变量和全局函数:使用 this 关键字可以避免全局变量和全局函数的命名冲突和代码污染。例如,可以使用 varlet 关键字定义全局变量,但是不能直接使用全局变量,而是需要使用 this 关键字访问。

  5. 访问闭包中的变量和方法:在 JavaScript 中,闭包中的变量和方法是私有的,不能直接访问。但是,可以使用 this 关键字访问闭包中的变量和方法。例如,this.counter 可以用来访问闭包中的 counter 变量。

  6. 避免函数嵌套:在 JavaScript 中,函数嵌套会导致函数内部的变量被覆盖,从而无法访问。但是,使用 this 关键字可以避免函数嵌套的问题。例如,var counter = 0;var counter = 0; 定义了两个变量,但是使用 this 关键字可以避免变量被覆盖的问题。

综上所述,this 关键字在 JavaScript 中具有非常重要的作用,它可以帮助我们访问对象的属性和方法,调用对象的方法和访问对象的属性,访问原型链上的属性和方法,避免全局变量和全局函数的命名冲突和代码污染,访问闭包中的变量和方法,以及避免函数嵌套的问题。因此,在 JavaScript 中,我们需要熟练掌握 this 关键字的重要性,并正确地使用它来处理对象和函数之间的关系。

二、this的基本概念

解释this的定义和作用。

this 是一个 JavaScript 关键字,它用于表示当前执行上下文对象
在函数中,this 的值取决于函数是否被作为构造函数调用,或者是否被作为普通函数调用

1. 当函数作为构造函数被调用时:

如果函数被作为构造函数调用,那么 this值会自动绑定到新创建的对象上。例如:

function Person(name, age) {this.name = name;this.age = age;
}var person = new Person("张三", 25);
console.log(person.name); // 输出 "张三"

在这个例子中,Person 函数作为构造函数被调用,创建了一个新的 Person 对象。由于 this 的值自动绑定到新创建的对象上,因此 this.namethis.age 分别被绑定到对象的 nameage 属性上。

2. 当函数作为普通函数被调用时:

如果函数被作为普通函数调用,那么 this值会指向全局对象(通常是 window 对象)。例如:

function sayHello() {console.log("Hello, world!");
}sayHello(); // 输出 "Hello, world!"

在这个例子中,sayHello 函数作为普通函数被调用,由于 this 的值指向全局对象,因此 console.log 中的 "Hello, world!" 被输出到全局对象 window 上。

3. 当函数作为参数传递给另一个函数时:

如果函数作为参数传递给另一个函数,那么 this 的值会指向接收函数的 this 值。例如:

function logMessage(message) {console.log(message);
}var logMessage = logMessage;
logMessage("Hello, world!"); // 输出 "Hello, world!"

在这个例子中,logMessage 函数被作为参数传递给另一个函数 logMessage,由于接收函数的 this 值指向全局对象 window,因此 logMessage 中的 console.log 中的 "Hello, world!" 被输出到全局对象 window 上。

综上所述,this 是一个非常重要的关键字,它可以帮助我们访问对象的属性和方法,调用对象的方法和访问对象的属性,以及确定函数的执行上下文。因此,在 JavaScript 中,我们需要熟练掌握 this 的定义和作用,并正确地使用它来处理对象和函数之间的关系。

三、不同的绑定方式

介绍this的四种绑定方式:默认绑定、隐式绑定、显式绑定和 new 绑定。

在 JavaScript 中,this 有四种绑定方式,分别是默认绑定、隐式绑定、显式绑定和 new 绑定。这四种绑定方式分别适用于不同的场景,下面我们来详细介绍这四种绑定方式。

  1. 默认绑定(Function 函数默认绑定)

当函数作为普通函数调用时,this 的默认绑定方式是全局对象(通常是 window 对象)。例如:

function sayHello() {console.log("Hello, world!");
}sayHello(); // 输出 "Hello, world!"

在这个例子中,sayHello 函数作为普通函数被调用,由于 this 的默认绑定方式是全局对象,因此 console.log 中的 "Hello, world!" 被输出到全局对象 window 上。

  1. 隐式绑定(函数内变量默认绑定)

在函数内部,如果变量没有被赋值,它会自动绑定到 this。例如:

function sayHello() {console.log(this);
}sayHello(); // 输出 window

在这个例子中,sayHello 函数内部的 this 指向全局对象 window,因此 console.log 中的输出结果是 window

  1. 显式绑定(使用 call 方法或 apply 方法显式绑定)

我们可以使用 call 方法或 apply 方法来显式地绑定 this。例如:

function sayHello() {console.log(this);
}sayHello.call(null); // 输出 undefined
sayHello.call(window); // 输出 window

在这个例子中,我们使用 call 方法将 this 显式地绑定到全局对象 window 上,因此 console.log 中的输出结果是 window

function sayHello() {console.log(this);
}sayHello.apply(null); // 输出 undefined
sayHello.apply(window); // 输出 window
  1. new 绑定(使用 new 关键字创建对象时绑定)

当我们使用 new 关键字创建对象时,this 会自动绑定到新创建的对象上。例如:

function Person(name, age) {this.name = name;this.age = age;
}var person = new Person("张三", 25);
console.log(person.name); // 输出 "张三"

在这个例子中,我们使用 new 关键字创建了一个 Person 对象,因此 this 的绑定方式是该对象本身。因此,我们在函数内部使用 this.name 可以正确地访问对象的属性。

总结一下,四种绑定方式分别是:

  1. 默认绑定(Function 函数默认绑定):当函数作为普通函数调用时,this 的默认绑定方式是全局对象(通常是 window 对象)。
  2. 隐式绑定(函数内变量默认绑定):在函数内部,如果变量没有被赋值,它会自动绑定到 this
  3. 显式绑定(使用 call 方法或 apply 方法显式绑定):我们可以使用 call 方法或 apply 方法来显式地绑定 this
  4. new 绑定(使用 new 关键字创建对象时绑定):当我们使用 new 关键字创建对象时,this 会自动绑定到新创建的对象上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284248.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端接口开发-web前台请求接口对后台数据库增删改查-实例

一、后端接口开发的逻辑是: 1.Application项目启动 2.前台接口Url请求后台 3.Controller控制拿到前台请求参数,传递给中间组件Service 4.Service调用Mapper.java 5. mapper.java映射到mapper.xml中的mybatis语句,类似Sql语句操作数据库 6.其…

Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)

目录 一、前言 二、基于注解配置Bean 1.基本介绍 : 2.应用实例 : 3.注意事项 : 三、手动实现Spring 注解配置机制 1.需求 : 2.思路 : 3.实现 : 3.1 自定义注解类 3.2 自定义配置类 3.3 自定义容器类 3.4 在测试类中进行测试 四、自动装配 0.总述 : 1.AutoWired自动装…

Python 爬虫开发完整环境部署,爬虫核心框架安装

Python 爬虫开发完整环境部署 前言: ​ 关于本篇笔记,参考书籍为 《Python 爬虫开发实战3 》 笔记做出来的一方原因是为了自己对 Python 爬虫加深认知,一方面也想为大家解决在爬虫技术区的一些问题,本篇文章所使用的环境为&#x…

音视频:Ubuntu下安装 FFmpeg 5.0.X

1.安装相关依赖 首可选一: sudo apt-get update sudo apt-get install build-essential autoconf automake libtool pkg-config \libavcodec-dev libavformat-dev libavutil-dev \libswscale-dev libresample-dev libavdevice-dev \libopus-dev libvpx-dev libx2…

思码逸企业版 4.0 特性之一:支持 DevOps 全工具链数据分析

《研发效能实践指南》中有一句话“数据驱动不是万能的,没有数据驱动是万万不能的”,数据对于研发效能管理的重要性可见一斑。所以很多团队在做研发效能度量时都在利用各种工具收集、分析着各种数据。 作为一站式研发效能度量平台,思码逸优先…

【Unity动画】综合案例完结-控制角色动作播放+声音配套

这个案例实现的动作并不复杂,主要包含一个 跳跃动作、攻击动作、还有一个包含三个动画状态的动画混合树。然后设置三个参数来控制切换。 状态机结构如下: 完整代码 using System.Collections; using System.Collections.Generic; using UnityEngine;pu…

Leetcode—1523.在区间范围内统计奇数数目【简单】

2023每日刷题&#xff08;六十三&#xff09; Leetcode—1523.在区间范围内统计奇数数目 实现代码 class Solution { public:int countOdds(int low, int high) {int cnt 0;int l low, r high;while(l < r) {if(l % 2) {break;}l;}while(r > low) {if(r % 2) {break…

【算法Hot100系列】盛最多水的容器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于JAVA+SpringBoot+Vue的前后端分离的大学健康档案管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的发展和科技…

低代码开发如何快速构建AI应用

随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;越来越多的企业和开发者开始意识到AI在业务和应用中的重要性。然而&#xff0c;AI应用的开发通常被认为是复杂和耗时的过程&#xff0c;需要大量的编码和数据科学知识。为了解决这个问题&#xff0c;低代码开发平…

中通快递单号查询入口,删除不需要的单号

批量查询中通快递单号的物流信息&#xff0c;并删除不需要的单号。 所需工具&#xff1a; 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&#xff0c;然后登录…

【数据结构】八大排序之堆排序算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.堆排序简介及思路 二.堆排序的代码实现 三.堆排序的时间复杂度分析 结语 一.堆排序简介及思路 堆排序(Heap Sort)是一种效率较高的选择排序算法. 它是指利用堆积树…