JavaScript 中 this 指向问题分析与解决

JavaScript 中 this 指向问题分析与解决

在 JavaScript 中,this 是一个关键字,它的指向与函数的调用方式密切相关。许多开发者在写代码时常常遇到 this 指向不明确的问题,导致错误的结果。今天,我们将通过分析一段代码,来详细探讨 this 指向的问题,并提供解决方案

代码分析

var obj = {age: 11,growup: function () {console.log("my age is " + this.age);function growup() {this.age++;console.log("I am growup. I am " + this.age + " years old now!");}growup();}
}
obj.growup();
  • this 在对象方法中的指向

    首先,我们来看 obj.growup() 方法的调用。我们调用了 obj 对象的 growup 方法,this 在方法调用时指向该对象 obj this 指向 obj

      console.log("my age is " + this.age);  // 输出 "my age is 11"// 在这里,this.age 访问的是 obj 对象中的 age 属性,输出为 11
    
  • this 的指向

    • 在 JavaScript 中,this 的指向是动态的,取决于函数是如何被调用的。通常情况下,this 的指向有以下几种规则
      • 对象方法调用: 如果函数作为对象的方法调用,this 指向该对象
      • 普通函数调用: 如果函数是作为普通函数调用(即不属于任何对象),this 会指向全局对象(在浏览器中是 window,在 Node.js 中是 global)。如果在严格模式下,this 会是 undefined。

    在我们的代码中,growup() 函数是作为普通函数调用的,而不是作为方法调用。因此,在执行 growup() 时,this 指向了 全局对象(在浏览器环境中是 window),而不是 obj 对象

  • 进入嵌套的 growup 函数

    接下来,我们在 growup 方法内定义了一个嵌套函数 growup()。注意,growup() 是一个普通函数,而不是作为对象方法调用的,因此它的 this 指向是一个重要的焦点

     function growup() {  this.age++;  console.log("I am growup. I am " + this.age + " years old now!");  // I am growup. I am NaN years old now!}
    
  • 为什么 NaN?

    this.age++ 在此时尝试访问 window.age,如果 age 在全局对象上未定义,它会被初始化为 undefined,然后,undefined++ 结果是 NaN,因为 undefined 不能进行加法操作,JavaScript 会将其转为 NaN。

  • growup 函数调用后的最终输出

    // my age is 11
    // I am growup. I am NaN years old now!
    
  • 解决 this 问题

    • 使用箭头函数

      箭头函数不会创建自己的 this,而是继承外部函数的 this。因此,使用箭头函数可以确保 this 指向 obj 对象,而不是全局对象

    如:

    var obj = {age: 11,growup: function () {console.log("my age is " + this.age);  // 输出 "my age is 11"const growup = () => {  // 使用箭头函数this.age++;  console.log("I am growup. I am " + this.age + " years old now!");};growup();  // 输出 "I am growup. I am 12 years old now!"}}obj.growup();
    
    • 使用 bind() 方法

      另一个常见的解决方案是使用 bind() 方法来显式绑定 this 的值。bind() 方法返回一个新的函数,并将 this 指向绑定到指定的对象

      如:

      var obj = {age: 11,growup: function () {console.log("my age is " + this.age);  // 输出 "my age is 11"const growup = () => {  // 使用箭头函数this.age++;  console.log("I am growup. I am " + this.age + " years old now!");};growup.bind(this)(); // 显式绑定 this}
      }
      obj.growup();
      

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

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

相关文章

zabbix安装配置与使用

zabbix Zabbix的工作原理如下: 监控部分: Zabbix Agent安装在各个需要监控的主机上,它以主配置的时间间隔(默认60s)收集主机各项指标数据,如CPU占用率、内存使用情况等。 通讯部分: Agent会把收集的数据通过安全通道(默认10051端口)发送到Zabbix Server。Server会存储这些数…

7.3、实验三:RIPv2的基本配置

源文件: 7.3、实验三:RIPv2的基本配置: https://url02.ctfile.com/d/61945102-63684790-45f44b?p2707 (访问密码: 2707) 一、目的 能够使用RIPv2路由协议 二、实验要求 1.要求 使用RIPv2协议,使得PC0 和 Service0能够通信,…

石岩田心村的地面停车点(月卡350)

​我之前一直以为城中村里的地面停车场会比上屋地铁口的联天停车场便宜一些。没想到这个田心村月卡也是350元哈。比对面的园岭村还贵,元岭村月卡我记得才260元。 田心村停车场标识牌 序号 收费项目 收费标准 1 小车临时停放 10元/小时,超过1小时加收…

大模型学习笔记------CLIP模型的再思考

大模型学习笔记------CLIP模型的再思考 1、CLIP模型与Prompt(提示)的思考2、CLIP模型与ResNet等分类模型的根本区别3、结束语 上文已经讲 CLIP(Contrastive Language-Image Pretraining)这个模型,也讲了我的一些思考。但是,随着深…

Spring之依赖注入(DI)和控制反转(IoC)——配置文件、纯注解

依赖注入 依赖注入(Dependency Injection,简称 DI)与控制反转(loC)的含义相同,只不过这两 个称呼是从两个角度描述的同一个概念。对于一个 Spring 初学者来说,这两种称呼很难理解, 下面我们将通过简单的语言来描述这两个概念。 当Java对象&…

外网访问 Immich 照片管理软件

Immich 是一个自托管的照片和视频备份的平台,它允许用户在私有服务器上存储、管理和分享他们的照片,视频等媒体文件。 第一步,本地部署安装 Immich 1,检查 Docker 服务状态,确保 Docker 正常运行。 systemctl statu…

Linux网络命令:它用于实时监控网络接口的状态变化的命令 ip monitor详解

目录 一、概述 二、使用 1、语法 2、对象类型 3、常用选项 4、获取帮助 三、 示例 1. 监视链路层变化 2. 监视所有的网络变化 3. 仅监视路由表的变化 4. 监视特定网络接口的状态变化: 5. 监视网络接口地址的变化 四、实际应用 五、其他事项 一、概述 …

QT仿QQ聊天项目,第三节,实现主界面(好友列表)

目录 一,主界面示例 二,主界面控件组成 三,好友列表实现 1,好友列表的实现原理 2,实现示例代码 一,主界面示例 二,主界面控件组成 三,好友列表实现 1,好友列表的实现…

查找连表的倒数第k个节点

居安思危 何解? 1、假如有1、2、3三个节点,找倒数第二个,实际是整数第几个? 3-21 2 : 及 length - k 1 ,所以先遍历找节点长度,在遍历找所需节点 // 今天这不是力扣的var findNode function(head , k){…

练习LabVIEW第三十九题

学习目标: 刚学了LabVIEW,在网上找了些题,练习一下LabVIEW,有不对不好不足的地方欢迎指正! 第三十九题: 程序开始运行后要求用户输入密码,密码正确时字符串显示控件显示 “欢迎进入”&#x…

AI浪潮将席卷一切:本·霍洛维茨的AI战略与发展观点

近年来,人工智能(AI)的快速发展已经成为全球科技与经济变革的核心驱动力。从自驾汽车到生成式对话系统,AI正以前所未有的速度改变我们的生活、工作方式以及社会结构。然而,作为硅谷著名风险投资公司a16z的联合创始人&a…

windows下位机远程调试

一、前言 发布到下位机的程序在某种操作下出现异常,一种有效的远程调试手段能更快的帮助我们定位问题和解决问题。 VS结合Remote Debugger可以让下位机程序像运行在上位机上一样打断点调试,非常方便。 二、调试环境部署 1、设置下位机程序运行所在目录共…

C++ 多态原理

用一个题目引入&#xff1a; 现有代码&#xff1a; class Base { public:virtual void func(){cout << "Base:func()" << endl;} protected:int _a1;char _bx; }; void test1() {Base obj;cout << sizeof(obj) << endl; } 32位平台上输出的…

Javaweb梳理8——数据库设计

Javaweb梳理8——数据库设计 8 数据库设计8.1 数据库设计简介8.2 表关系(一对多)8.3 表关系&#xff08;多对多&#xff09;8.4 表关系&#xff08;一对一&#xff09; 8 数据库设计 8.1 数据库设计简介 软件的研发步骤 数据库设计概念 数据库设计就是根据业务系统的具体需…

TypeError: Cannot read properties of undefined (reading ‘__asyncLoader‘)

项目场景&#xff1a; vue3element-plus 项目场景&#xff1a;vue3element-plustsvite的技术栈开发的后台&#xff0c;一个后台列表页面&#xff0c;使用了ElTable组件 问题描述 页面提示报一个好像是异步的问题 runtime-core.esm-bundler.js:2261 Uncaught (in promise) Ty…

SAP ABAP开发学习——BADI增强操作步骤示例1

SAP ABAP开发学习——第三代增强&#xff08;BADI)-CSDN博客 SAP ABAP开发学习——BADI增强操作步骤示例2-CSDN博客 创建物料MM01的增强 首先进入SE24 打断点&#xff0c;运行事务MM01,启动debug,获得增强的名字 F8依次获得下一个增强的名字 继续获得增强 进入选择视图以及销…

odrive代码阅读笔记

电机参数 电流环带宽 atan2 // based on https://math.stackexchange.com/a/1105038/81278 float fast_atan2(float y, float x) {// a : min (|x|, |y|) / max (|x|, |y|)float abs_y fabsf(y);float abs_x fabsf(x);// inject FLT_MIN in denominator to avoid division …

C++多线程常见的数据竞争模式及示例分析

一、简单竞争 最简单的数据竞争是最常见的一种&#xff1a;两个线程在没有任何同步的情况下访问一个内置类型的变量。很多时候&#xff0c;这种竞争是良性的&#xff08;代码统计一些允许不精确的统计信息&#xff09;。 int var;void Thread1() { // 在一个线程中运行。var;…

Jest进阶知识:测试快照 - 确保组件渲染输出正确

在 React 应用开发中&#xff0c;确保组件的渲染输出正确是一项重要的测试任务。快照测试是一种有效的方法&#xff0c;可以帮助开发者捕捉并验证组件的渲染输出&#xff0c;确保其在不同的情况下保持一致。 什么是快照测试&#xff1f; 快照测试的基本思想是&#xff1a; 首…

【AI落地应用实战】HivisionIDPhotos AI证件照制作实践指南

最近在网上发现了一款轻量级的AI证件照制作的项目&#xff0c;名为HivisionIDPhotos。它利用AI模型实现对多种拍照场景的识别、抠图与证件照生成&#xff0c;支持轻量级抠图、多种标准证件照和排版照生成、纯离线或端云推理、美颜等功能。此外&#xff0c;项目还提供了Gradio D…