深入理解前端中的 “this” 指针:从基础概念到复杂应用

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 本文全面解析前端开发中“this”指针的运用,从基本概念入手,逐步探讨其在不同场景下的表现与应用技巧,帮助开发者深入理解并灵活掌握“this”的使用。

深入理解前端中的 “this” 指针:从基础概念到复杂应用

摘要: 在前端 JavaScript 编程领域,“this” 指针宛如一把“钥匙”,解锁了诸多灵活且强大的编程模式,但其复杂多变的指向规则常让开发者感到困惑。本文将系统剖析 “this” 指针在不同场景下的绑定规则,从常规函数调用、对象方法调用,到构造函数场景以及事件处理函数语境,借助大量详实代码示例,揭示其底层逻辑,并阐述在现代前端框架(如 React、Vue)中,“this” 的独特表现与运用技巧,助力开发者精准掌控 “this”,编写出健壮、高效的前端代码。

一、“this” 指针基础概念与默认绑定

在 JavaScript 起始阶段,当一个函数被直接调用,未处于任何对象上下文关联时,“this” 遵循默认绑定规则,指向全局对象(在浏览器环境是 window,在 Node.js 环境是 global)。例如:

<!DOCTYPE html>
<html lang="en">

<body>
  <script>
    function sayHello() {
    
      console.log(this);
      console.log('Hello, ' + this === window);
    }
    sayHello();
  </script>
</body>

</html>

在上述代码中,sayHello 函数独立调用,执行时 this 指向 window 对象,控制台会打印出 window 对象相关信息,并显示 true,表明 this 确实等价于 window。不过在严格模式('use strict';)下,这种独立调用的函数,“this” 值会是 undefined,避免因意外修改全局对象属性带来的隐患,强制开发者遵循更严谨编程规范。

二、对象方法调用中的 “this” 绑定

当函数作为对象的方法被调用,“this” 会绑定到该对象。考虑如下代码构建简单图形对象:

let circle = {
   
  radius: 5,
  getArea: function () {
   
    return Math.PI * this.radius * this.radius;
  }
};
console.log(circle.getArea());

此处 getArea 函数作为 circle 对象的方法,函数体内 this 紧密绑定 circle,所以能顺利访问 circleradius 属性来准确计算圆面积。若将方法赋值给其他变量再调用,情况就变了:

let areaFunction = circle.getArea;
console.log(areaFunction());

这时 areaFunction 脱离 circle 对象环境独立调用,“this” 回归默认绑定(非严格模式下指向 window),在 window 上找 radius 自然失败,返回 NaN,凸显 “this” 绑定对调用上下文的高度依赖。

三、构造函数场景下的 “this” 指向

构造函数用于创建对象实例,借助 new 关键字调用时,函数内部 “this” 指向新创建的对象实例。像定义 Person 构造函数:

function Person(name, age) {
   
  this.name = name;
  this.age = age;
  this.sayInfo = function () {
   
    console.log('My name is'+ this.name + ', I am'+ this.age +'years old.');
  };
}
let person1 = new Person('Alice', 25);
person1.sayInfo();

执行 new Person 时,this 被绑定到新生成、初始为空的 person1 对象,随后构造函数内代码为其添加 nameage 属性与 sayInfo 方法,调用 sayInfo 时 “this” 仍指向 person1,准确输出对应个人信息。值得留意,若构造函数忘了用 new 调用,“this” 会按默认绑定规则指向全局对象,导致意外属性挂载与逻辑错误。

四、事件处理函数里的 “this” 特殊性

在前端 DOM 事件处理中,“this” 指向触发事件的 DOM 元素。以点击按钮为例:

<!DOCTYPE html>
<html lang="en">

<body>
  <button id="myButton">Click Me</button>
  <script>
    document.getElementById('myButton').onclick = function () {
    
      console.log(this);
      console.log(this === document.getElementById('myButton'));
    };
  </script>
</body>

</html>

点击按钮后,事件处理函数内 “this” 精准指向 <button> 元素自身,方便直接操作元素属性、样式等,像 this.style.backgroundColor = 'red'; 能当场改变按钮背景色。但在使用箭头函数作为事件处理函数时,“this” 行为有变,箭头函数自身没有 “this”,其 “this” 继承自所处词法环境,若在类组件方法里用箭头函数处理事件,“this” 指向类实例而非触发事件元素,使用需谨慎权衡。

五、现代前端框架中 “this” 的运用与考量

  1. React 框架:在 React 类组件时代,方法内 “this” 遵循常规 JavaScript 规则,为保障 setState 等方法正确调用,常需手动绑定 this,如在构造函数中 this.handleClick = this.handleClick.bind(this);。转向函数式组件与 Hooks 后,借助 useCallbackuseReducer 等 Hook,避免直接操作 “this”,让状态管理与逻辑处理更纯粹基于函数参数与闭包,降低 “this” 带来的心智负担。
  2. Vue 框架:Vue 实例方法里 “this” 指向 Vue 实例自身,在模板表达式、组件方法中可无缝访问 datacomputedmethods 等属性与方法,像 methods: { handleClick() { this.message = 'Clicked'; } },点击事件触发时修改实例 message 属性简便直观。同时 Vue 内部对 “this” 相关操作深度优化,保障数据响应与更新高效同步,开发者专注业务逻辑即可。

“this” 指针贯穿前端 JavaScript 编程全程,从基础语法到前沿框架应用,深入洞察其绑定规则与特殊情形,依据场景灵活把控,是跨越前端开发“新手区”,迈向精通的关键一步,助代码更稳健、高效,解锁无限编程可能。

相关文章
|
15天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
19天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
10天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
|
23天前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
9天前
|
人工智能 自然语言处理 前端开发
什么?!通义千问也可以在线开发应用了?!
阿里巴巴推出的通义千问,是一个超大规模语言模型,旨在高效处理信息和生成创意内容。它不仅能在创意文案、办公助理、学习助手等领域提供丰富交互体验,还支持定制化解决方案。近日,通义千问推出代码模式,基于Qwen2.5-Coder模型,用户即使不懂编程也能用自然语言生成应用,如个人简历、2048小游戏等。该模式通过预置模板和灵活的自定义选项,极大简化了应用开发过程,助力用户快速实现创意。
|
5天前
|
云安全 存储 弹性计算
|
7天前
|
云安全 人工智能 自然语言处理
|
5天前
|
人工智能 C++ iOS开发
ollama + qwen2.5-coder + VS Code + Continue 实现本地AI 辅助写代码
本文介绍在Apple M4 MacOS环境下搭建Ollama和qwen2.5-coder模型的过程。首先通过官网或Brew安装Ollama,然后下载qwen2.5-coder模型,可通过终端命令`ollama run qwen2.5-coder`启动模型进行测试。最后,在VS Code中安装Continue插件,并配置qwen2.5-coder模型用于代码开发辅助。
375 4
|
5天前
|
缓存 Linux Docker
【最新版正确姿势】Docker安装教程(简单几步即可完成)
之前的老版本Docker安装教程已经发生了变化,本文分享了Docker最新版安装教程,其他操作系统版本也可以参考官 方的其他安装版本文档。
【最新版正确姿势】Docker安装教程(简单几步即可完成)
|
11天前
|
人工智能 自然语言处理 前端开发
用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。本教程完全免费,而且为大家准备了 100 个降噪蓝牙耳机,送给前 100 个完成的粉丝。获奖的方式非常简单,只要你跟着教程完成第一课的内容就能获得。