深入解析Javascript中的this指向

深入解析Javascript中的this指向

      • 定义问题
      • this的基本规则
      • Vue2 中的 `this` 问题
        • 问题场景:`this` 丢失
        • 解决方案:保存 `this` 的引用
      • 现代方法:使用箭头函数
      • 为什么仍然有人定义 `self = this`?
      • 总结

在 JavaScript 中,this 是一个非常重要但也容易让人困惑的概念,因为它的值是动态的,会根据使用的上下文有所不同。在 Vue2 的开发中,尤其是在函数或方法中,常常会看到有人给 this 赋值到一个变量(例如 const self = this;let _this = this;)。这是为了应对 this 的动态绑定问题。

接下来,我会详细解释 this 的工作原理以及为什么会出现这种用法。


定义问题

this 是什么?它的值是如何决定的?为什么在 Vue2 开发中会给 this 单独定义一个变量?


this的基本规则

  1. 全局上下文

    • 在浏览器中,直接调用 this 指向全局对象 window
      console.log(this); // 在全局作用域中输出 window
      
    • 在严格模式下,thisundefined
      'use strict';
      console.log(this); // 输出 undefined
      
  2. 对象方法调用

    • 如果 this 在一个对象的方法中,通常指向调用这个方法的对象:
      const obj = {name: 'Vue',getName() {return this.name;},
      };
      console.log(obj.getName()); // 输出 'Vue'
      
  3. 构造函数或类

    • 在构造函数中,this 指向新创建的实例:
      function Person(name) {this.name = name;
      }
      const person = new Person('Vue');
      console.log(person.name); // 输出 'Vue'
      
  4. 箭头函数

    • 箭头函数不会创建自己的 this,它会捕获定义时所在的上下文的 this
      const obj = {name: 'Vue',getName: () => {console.log(this.name); // 这里的 this 指向定义时的上下文},
      };
      obj.getName(); // 输出 undefined
      
  5. 动态绑定

    • 调用方式(callapplybind)会动态绑定 this
      function sayHello() {console.log(this.name);
      }
      const user = { name: 'Vue' };
      sayHello.call(user); // 输出 'Vue'
      

Vue2 中的 this 问题

在 Vue2 中,组件的实例通过 this 访问,例如:

export default {data() {return {message: 'Hello Vue!',};},methods: {showMessage() {console.log(this.message); // 正常输出 'Hello Vue!'},},
};
问题场景:this 丢失

当我们在方法中使用函数时,尤其是回调函数,this 的指向可能会丢失。例如:

  1. 普通函数导致的丢失

    methods: {delayedMessage() {setTimeout(function () {console.log(this.message); // 这里的 this 指向了 window(或 undefined,取决于严格模式)}, 1000);},
    },
    
  2. 回调函数

    methods: {fetchData() {someAsyncFunction(function () {console.log(this.message); // 这里的 this 也不再指向 Vue 实例});},
    },
    
解决方案:保存 this 的引用

为了确保回调函数中仍然可以访问 Vue 实例的上下文,我们通常会将 this 赋值给一个变量(例如 self_this):

methods: {delayedMessage() {const self = this; // 保存当前 thissetTimeout(function () {console.log(self.message); // 这里使用 self 而不是 this}, 1000);},
},

这种方式避免了 this 动态绑定问题,因为 self 是一个普通的变量,它不会因为上下文变化而改变。


现代方法:使用箭头函数

箭头函数的 this 是在定义时绑定的,它会捕获外层函数的 this。因此我们可以直接使用箭头函数来解决:

methods: {delayedMessage() {setTimeout(() => {console.log(this.message); // 箭头函数保证了 this 指向 Vue 实例}, 1000);},
},

这是一种更优雅的解决方案,适合现代 JavaScript 开发。


为什么仍然有人定义 self = this

  • 兼容性:箭头函数是 ES6 特性,如果需要兼容旧环境,定义 self 是更通用的解决方案。
  • 老代码习惯:一些老的项目中,团队可能习惯了这种方式。
  • 更明确的语义:某些场景下,使用 self 能够明确地表明它是一个保存上下文的引用。

总结

  • this 是动态绑定的,指向取决于调用的上下文。
  • 在 Vue2 中,常见的 this 丢失场景包括回调函数和普通函数。
  • 解决方案:
    • 使用 const self = this; 保存引用。
    • 使用箭头函数(推荐)。

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

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

相关文章

【爬虫实战】抓取某站评论

【爬虫实战】抓取某站评论 声明:本文中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 方式一:JS逆向request发…

OpenSSL 自签名

参考文档:unigui开发人员工作手册2021 参考文章:保姆级OpenSSL下载及安装教程-CSDN博客 下载 Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 进入后向下拉找到下载位置,建议下载二进制版本的精简版&#xff0c…

基于YOLOv8深度学习的公共卫生防护口罩佩戴检测系统(PyQt5界面+数据集+训练代码)

在全球公共卫生事件频发的背景下,防护口罩佩戴检测成为保障公众健康和控制病毒传播的重要手段之一。特别是在人员密集的公共场所,例如医院、学校、公共交通工具等地,口罩的正确佩戴对降低病毒传播风险、保护易感人群、遏制疫情扩散有着至关重…

stm32下的ADC转换(江科协 HAL版)

十二. ADC采样 文章目录 十二. ADC采样12.1 ADC的采样原理12.2 STM32的采样基本过程1.引脚与GPIO端口的对应关系2.ADC规则组的四种转换模式(**)2.2 关于转换模式与配置之间的关系 12.3 ADC的时钟12.4 代码实现(ADC单通道 & ADC多通道)1. 单通道采样2. 多通道采样 19.ADC模数…

“fc-async”提供了基本的异步处理能力

在开发中,异步处理已经成为提升系统性能和用户体验的常用方式。然而,传统的@Async注解和基础的异步处理工具在面对复杂的任务场景时,存在局限性。这些局限性包括但不限于高并发环境下的稳定性、任务失败后的恢复机制、以及任务的监控和管理。 开源项目“fc-async”提供了基…

【linux】如何扩展磁盘容量(VMware虚拟机)-转载

如何扩展磁盘容量(VMware虚拟机) 一、前置准备工作 扩展虚拟机磁盘前,需要先把虚拟机关机才能进行扩展磁盘操作 1.选择虚拟机设置,如下图所示 2.输入你想扩展的磁盘容量,以本次实操为例,我这里输入的30G(具体按照实…

记录配置ubuntu18.04下运行ORBSLAM3的ros接口的过程及执行单目imu模式遇到的问题(详细说明防止忘记)

今天的工作需要自己录制的数据集来验证昨天的标定结果 用ORBSLAM3单目imu模式运行,mentor给的是一个rosbag格式的数据包,配置过程出了几个问题记录一下,沿配置流程写。 一.orbslam3编译安装 1.首先是安装各种依赖 这里不再赘述&#xff0…

STM32设计井下瓦斯检测联网WIFI加Zigbee多路节点协调器传输

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 本系统基于STM32微控制器和Zigbee无线通信技术,设计了…

华为HCIP——MSTP/RSTP与STP的兼容性

一、MSTP/RSTP与STP的兼容性的原理: 1.BPDU版本号识别:运行MSTP/RSTP协议的交换机会根据收到的BPDU(Bridge Protocol Data Unit,桥协议数据单元)版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU…

Python绘制雪花

文章目录 系列目录写在前面技术需求完整代码代码分析1. 代码初始化部分分析2. 雪花绘制核心逻辑分析3. 窗口保持部分分析4. 美学与几何特点总结 写在后面 系列目录 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4…

第六节、Docker 方式部署指南 github 上项目 mkdocs-material

一、简介 MkDocs 可以同时编译多个 markdown 文件,形成书籍一样的文件。有多种主题供你选择,很适合项目使用。 MkDocs 是快速,简单和华丽的静态网站生成器,可以构建项目文档。文档源文件在 Markdown 编写,使用单个 YAML 配置文件配置。 MkDocs—markdown项目文档工具,…

Spring Boot教程之Spring Boot简介

Spring Boot 简介 接下来一段时间,我会持续发布并完成Spring Boot教程 Spring 被广泛用于创建可扩展的应用程序。对于 Web 应用程序,Spring 提供了 Spring MVC,它是 Spring 的一个广泛使用的模块,用于创建可扩展的 Web 应用程序。…

无线迷踪:陈欣的网络之旅

第一章 陈欣是一名资深的网络工程师,工作在一家领先的科技公司。她的生活平静而有序,直到有一天,公司的无线网络突然出现了严重的问题。员工们的设备频繁断开连接,无法正常使用。这个问题不仅影响了工作效率,还引起了…

ssm129办公用品管理系统开发与设计+jsp(论文+源码)_kaic

毕 业 设 计(论 文) 题目:办公用品管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本办公用品管理系统…

OMV7 树莓派 tf卡安装

​ 升级7之后,问题多多,不是docker不行了,就是代理不好使 今天又重装了一遍,用官方的链接,重新再折腾一遍…… 使用raspberry pi imager安装最新版lite OS。 注意是无桌面 Lite版 配置好树莓派初始化设置&#xff0…

【数据结构与算法】查找

文章目录 一.查找二.线性结构的查找2.1顺序查找2.2折半查找2.3分块查找 三.树型结构的查找3.1二叉排序树1.定义2.二叉排序树的常见操作3.性能分析 3.2平衡二叉树1.定义2.平衡二叉树的常见操作3.性能分析 3.3B树1.定义2.B树的相关操作 3.4B树1.定义2.B树与B树的比较 四.散列表1.…

SpringCloud篇(服务保护 - Sentinel)

目录 一、雪崩问题及解决方案 1. 雪崩问题 2. 解决方案 方案一:超时处理 方案二:仓壁模式 方案三:断路器模式 方案四:限流 3. 总结 二、服务保护技术对比 三、Sentinel介绍与安装 1. 初识Sentinel 2. Sentinel 优势 3…

C语言项⽬实践-贪吃蛇

目录 1.项目要点 2.窗口设置 2.1mode命令 2.2title命令 2.3system函数 2.Win32 API 2.1 COORD 2.2 GetStdHandle 2.3 CONSOLE_CURSOR_INFO 2.4 GetConsoleCursorInfo 2.5 SetConsoleCursorInfo 2.5 SetConsoleCursorPosition 2.7 GetAsyncKeyState 3.贪吃蛇游戏设…

笔记|M芯片MAC (arm64) docker上使用 export / import / commit 构建amd64镜像

很简单的起因,我的东西最终需要跑在amd64上,但是因为mac的架构师arm64,所以直接构建好的代码是没办法跨平台运行的。直接在arm64上pull下来的docker镜像也都是arm64架构。 检查镜像架构: docker inspect 8135f475e221 | grep Arc…

热点更新场景,OceanBase如何实现性能优化

案例背景 这个案例来自一个保险行业的客户:他们的核心系统底层采用了OceanBase数据库作为存储解决方案,然而,在系统上线运行后,出现了一个异常情况,执行简单的主键更新语句时SQL执行时间出现了显著的波动。为了迅速定…