JavaScript中this指向总结

news2024/10/6 2:14:25

在JavaScript中,this 关键字是一个非常重要的概念,它代表了当前执行上下文中的一个特殊对象。this 的值取决于函数是如何被调用的,而不是函数被定义的位置。以下是对 this 指向的详细解释:

1. 全局上下文中的 this

在全局执行上下文中(即不在任何函数内部),this 指向全局对象。在浏览器环境中,全局对象是 window;在Node.js环境中,全局对象是 global

console.log(this === window); // 在浏览器中输出 true  
console.log(this === global); // 在Node.js中输出 true

2. 函数上下文中的 this

2.1 普通函数调用

当函数作为普通函数被调用时(即不是作为对象的方法或构造函数),this 在非严格模式下指向全局对象,在严格模式下('use strict'this 是 undefined

function foo() {  
    return this;  
}  
  
console.log(foo() === window); // 在非严格模式下输出 true  
  
'use strict';  
console.log(foo() === undefined); // 在严格模式下输出 true
2.2 方法调用

当函数作为对象的方法被调用时,this 指向调用该方法的对象。

const obj = {  
    foo: function() {  
        return this;  
    }  
};  
  
console.log(obj.foo() === obj); // 输出 true
2.3 构造函数调用

当函数作为构造函数使用 new 关键字调用时,this 指向新创建的对象实例。

function Person(name) {  
    this.name = name;  
}  
  
const person = new Person('Alice');  
console.log(person.name); // 输出 'Alice'
2.4 箭头函数

箭头函数没有自己的 this 绑定。它们捕获其所在上下文的 this 值作为自己的 this 值,这种行为称为词法作用域(lexical scoping)或静态作用域。

function Person() {  
    this.age = 0;  
  
    setInterval(() => {  
        this.age++; // 这里的 `this` 指向 Person 实例  
    }, 1000);  
}  
  
const p = new Person();  
// 一秒后,p.age 将是 1

3. 显式绑定 this

JavaScript 提供了几种方法来显式地设置函数调用时的 this 值:

  • call() 方法:调用一个函数,并为其指定 this 值和参数(参数以逗号分隔)。
  • apply() 方法:调用一个函数,并为其指定 this 值和参数数组(或类数组对象)。
  • bind() 方法:创建一个新的函数,当这个新函数被调用时,它的 this 值被指定为 bind() 的第一个参数,其余参数将作为新函数的初始参数。
function greet() {  
    return `Hello, ${this.name}`;  
}  
  
const person = { name: 'Alice' };  
  
console.log(greet.call(person)); // 输出 'Hello, Alice'  
console.log(greet.apply(person)); // 输出 'Hello, Alice'  
  
const greetPerson = greet.bind(person);  
console.log(greetPerson()); // 输出 'Hello, Alice'

4. 特殊情况下的 this

  • 在事件处理函数中,this 通常指向触发事件的元素。
  • 在 setTimeout 和 setInterval 回调函数中,this 默认指向全局对象(除非使用箭头函数或显式绑定)。

5.总结

理解 this 的工作原理是掌握JavaScript的关键之一,因为它直接影响到函数的执行方式和数据的访问方式。this的指向是动态的,这是由函数的调用方式决定的。通常,this指向最后调用它的对象。总结以下是一些常见的this指向的情况:

  1. 在普通函数中,this指向全局对象(在浏览器中是window)。

  2. 在对象方法中,this指向调用该方法的对象。

  3. 在构造函数中,this指向新创建的对象。

  4. 在箭头函数中,this持有外层作用域中的this

  5. 在事件监听函数中,this通常指向监听该事件的DOM元素。

  6. 使用callapplybind可以显式改变this的指向。

// 普通函数中的this
function normalFunction() {
    console.log(this); // 输出全局对象,浏览器中一般是window
}
 
// 对象方法中的this
const myObject = {
    prop: 'value',
    method: function() {
        console.log(this); // 输出myObject,因为myObject调用了method
    }
};
myObject.method();
 
// 构造函数中的this
function MyConstructor() {
    this.prop = 'value';
}
const myInstance = new MyConstructor();
console.log(myInstance.prop); // 输出'value'
 
// 箭头函数中的this
const obj = {
    prop: 'value',
    arrowMethod: () => {
        console.log(this); // 输出外层this,通常是window
    }
};
obj.arrowMethod();
 
// 事件监听函数中的this
document.getElementById('myButton').addEventListener('click', function() {
    console.log(this); // 输出监听事件的DOM元素,即myButton
});
 
// 使用call改变this的指向
const otherObject = { prop: 'otherValue' };
function independentFunction() {
    console.log(this.prop); // 输出传入对象的prop值
}
independentFunction.call(otherObject); // 输出'otherValue'

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考数据库部分 ---- (概念数据库模型,三级模式,两级映像,事物管理)

文章目录 一、概念数据库模型二、结构数据库模型三、三级模式四、两级映像五、关系模式基本术语六、关系模式七、关系的数学定义八、数据定义语言九、SQL访问控制十、视图十一、索引十二、关系模式十三、范式十四、数据库设计十五、事物管理(ACID)十六、…

基于SPI协议的Flash扇区擦除实验

当一块Flash芯片中的不同的扇区烧录了不同的程序,而我们只想擦除某个扇区的程序保留其他程序时,Flash的全擦除是不能满足要求的,这时候就需要扇区擦除来实现这一功能。扇区擦除可以对Flash芯片中的某一扇区进行擦除而不改变其他扇区中的存储数…

2.3MyBatis——插件机制

2.3MyBatis——插件机制 1.基本用法2.原理探究2.1加载过程2.2执行过程2.2.1 插件的执行点2.2.2 SQL执行的几个阶段2.2.3 如何梳理出执行流程 插件机制是一款优秀框架不可或缺的组成部分,比如spring、dubbo,还有我们要聊的Mybatis等等。所谓插件&#xff…

【AI大模型】使用Embedding API

一、使用OpenAI API 目前GPT embedding mode有三种,性能如下所示: 模型每美元页数MTEB得分MIRACL得分text-embedding-3-large9,61554.964.6text-embedding-3-small62,50062.344.0text-embedding-ada-00212,50061.031.4 MTEB得分为embedding model分类…

Linux驱动开发(速记版)--printctl子系统

第102章 pinctrl 子系统的引入 Linux中的 pinctrl子系统是管理和配置GPIO引脚的框架,提供标准化方法以适应不同硬件。 它遵循 Linux内核设备模型,分为设备、驱动等部分。 本章节从设备和驱动角度介绍 pinctrl子系统。 102.1 pinctrl 设备树 在设备树中&a…

旅游心动盲盒:开启个性化旅行新体验

嘿,宝子们!在如今这个数字化时代呀,文心智能体可是给咱们的生活带来了超多便利和创新呢。今天呀,我来给大家介绍一款超棒的智能体——旅游心动盲盒,它肯定能给你的旅行带来全新的惊喜和超个性化的体验哟。 一、项目背…

基于H3C环境的实验——OSPF

目录 实验设备和环境 实验设备 实验环境 实验记录 1、单区域 OSPF基本配置 步骤1:搭建实验环境并完成基本配置 步骤2:检查网络连通性和路由器路由表。 步骤3:配置OSPF 步骤4:检查路由器OSPF邻居状态及路由表 实验设备和环境 实验设备 三台路由器、两台PC、电源线、两…

GO网络编程(四):海量用户通信系统2:登录功能核心【重难点】

目录 一、C/S详细通信流程图二、消息类型定义与json标签1. 消息类型定义2. JSON标签3.结构体示例及其 JSON 表示:4.完整代码与使用说明 三、客户端发送消息1. 连接到服务器2. 准备发送消息3. 创建 LoginMes 并序列化4. 将序列化后的数据嵌入消息结构5. 序列化整个 M…

java 数据存储方式

1. 变量存储 这是最基本的数据存储方式,通过声明变量来存储数据。变量可以是基本数据类型(如int、float、char等),也可以是引用数据类型(如对象、数组等)。变量存储的数据通常存储在内存中,随着…

有状态(Session) VS 无状态(Token)

目录 概念 JWT Token在项目中使用 概念 有状态和无状态服务是两种不同的服务架构,两者的不同之处在于对于服务状态的处理。 1、有状态服务 是指程序在执行过程中生成的中间数据,服务器端一般都要保存请求的相关信息,每个请求可以默认地使…

Hugging Face 任意大模型仓库劫持 - 无声的破坏

摘要 在这篇博客中,我们展示了攻击者如何攻击Hugging Face的Safetensors转换空间及其相关的服务机器人。这些服务是一个在Hugging Face上广受欢迎的服务,专门用于将不安全的机器学习模型转换为更安全的版本。我们随后展示了如何通过Hugging Face自身的服…

C0016.Clion中qDebug()打印输出中文时,都是问号??????的解决办法

问题描述 在clion中使用qDebug打印输出中文内容时,都是?????如下图: 注意:修改该文件的编码格式就行,该文件名为apr.cpp; 解决办法

矩阵求解复数(aniwoth求解串扰)

所以这种求解串扰的格式是因为,有串扰的共轭项在方程组中 复数共轭项的作用,但是这是二次方程,

vue2集成vuex实现网站统一数据管理

文章目录 前言安装配置过程1、安装vuex依赖2、在src目录下创建store文件夹,创建模块site.jsgetters.jsindex.js 3、在man.js中添加vuex vuex实战:存储与获取网站基础数据何时去存储数据?(路由前置获取数据)如何取数据&…

windows中下载、安装、配置JDK/JDK环境配置/Java配置环境变量/Linux中安装配置JDK环境

JDK下载(官网)、安装、配置(包括系统、idea、eclipse)一篇就够了 1、问题概述? Java开发者必须掌握的JDK下载、安装、配置过程。 包括在Eclipse及IDEA中的配置使用 2、下载JDK 【注册Oracle官网账号】 下载的前天是注册orcle官网账号,作为开发者,这个必须有,随时关注…

RTX4060安装nvidia显卡驱动

文章目录 nvidia drivers下载删除原有nvidia驱动安装nvidia驱动如果报错Unable to find the kernel source tree for the currently runningbuilding kernel modules解决方法 报错成功安装!!! nvidia drivers下载 https://www.nvidia.cn/geforce/drivers/#:~:textNVIDIA%20GeF…

ESP01 AT指令学习

一 、AT指令 测试指令:ATCWMODE? 参数及取值范围 cwmode(1-3) 查询指令: ATCWMODE? 当前cwmode的取值 3 设置指令: ATCWMODE3 设置当前的cwmode为 3 1、station 模式 连接到其他wifi 2、softA…

【源码+文档】基于SpringBoot+Vue的酒店管理系统

🚩如何选题? 如何选题、让题目的难度在可控范围,以及如何在选题过程以及整个毕设过程中如何与老师沟通,这些问题是需要大家在选题前需要考虑的,具体的方法我会在文末详细为你解答。 🚭如何快速熟悉一个项目…

如何从 Windows 照片库恢复已删除的照片

数据丢失的主要原因之一是人为错误。更糟糕的是,回收站中没有备份或删除的文件。在这种情况下,数据恢复或适用于 Windows 的专用图片恢复工具可以为您提供帮助,因为它们可以帮助恢复已删除的图片。 牢记这一点,我们将讨论从 Wind…

基于SSM的电影院订票系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 开展本课题的意义及工作内容: 1.意义 系统管理也都将通过计算机进行整体智能化操作,对于电影院订票系统系统所牵扯的管理及数据保存都是非常多的,例如电影信息管理、订单管理等,…