当前位置: 首页 > news >正文

【二】JavaScript能力提升---this对象

目录

this的理解

this的原理

事件绑定中的this

行内绑定

动态绑定

window定时器中的this


相信小伙伴们看完这篇文章,对于this的对象可以有一个很大的提升!

this的理解

对于this指针,可以先记住以下两点:

  1. this永远指向一个对象
  2. this的指向完全取决于函数调用的位置

对于第一点,不管在什么地方使用this,它必然会指向某个对象。

由于在JavaScript中,一切皆对象,运行环境也是对象,所以函数都是在某个对象下运行,而this就是“函数运行时所在的对象(环境)

但因为JavaScript支持运行环境动态切换,即:this的指向是动态的,很难确定this到底指向哪个对象,这是最让我们感到困惑的地方。

this的原理

function fun()
{console.log(this.s);
}var obj = {s:'1',f:fun
}var s = '2';obj.f(); // 1
fun(); // 2

JS中,数组、函数、对象都是引用类型,在参数传递时也就是引用传递(传递内存地址)。

在上面代码中,obj有两个属性,但是f属性存储了一个函数名(函数的内存地址),于是在调用f方法时,通过f的值找到对应的内存地址就调用到了对应的函数。

下图是obj在内存中的表示:

在调动时就变成了下面这个样子:

下面,我们一条一条解释,相信看完这些解释,你会恍然大悟

关于obj.f()的调用

  • 调用objf方法时,js引擎先找到obj这个对象,随后在obj内存地址中找到f方法的地址,再调用f方法地址中的值(在这里这个值就是functiuon fun()这个函数的内存地址),于是成功调用这个函数。但由于该函数是经过:“js引擎 -> obj对象 ->f()”这么一个顺序调用的,因此此时fun()this指向它的运行环境,即obj对象

关于fun()的调用

  • 调用fun()时,js引擎要在整个<script>标签下搜寻“函数名为fun的函数”,因为是在整个<script>标签搜寻,故搜索到fun()函数时,运行环境固然在window对象下,该函数经过:“js引擎 -> 整个<script>环境(window对象) -> fun()”这个一个顺序调用的
var A = {name:'张三',f:function(){console.log('姓名:'+this.name);}
};var B = {name:"李四"
};B.f = A.f;
B.f(); // 姓名:李四
A.f(); // 姓名:张三

上面代码,仍然可以用我上面所说的来解释:

由于“函数”的传递是“引用传递”(传递内存地址),即此时B.f的值就是匿名函数的内存地址,故B.f()A.f()实际上调用的是“同一个内存地址的同一个函数

  • 调用B.f()时,js引擎根据B.f的值,找到对应的匿名函数,此时匿名函数的执行环境在B对象之下,故打印“李四”
  • 调用A.f()时,js引擎根据A.f的值,找到对应的匿名函数,此时匿名函数的执行环境在A对象之下,故打印“张三”

function foo()
{console.log(this.a);
}var obj2 = {a:2,f:foo
};var obj1 = {a:1,o:obj2
};obj1.o.f(); // 2

对于上面代码,仍仍仍然可以使用刚才所说的来解释:

  • 调用obj1.o.f()时,js引擎根据obj1.o(obj2的内存地址)先找到obj2对象,再根据f(foo的内存地址)找到foo,最后执行foo。此时整个调用关系为:“js引擎 -> obj1对象 -> obj2对象 -> foo()”,故foo运行在obj2对象之下,因此打印2

事件绑定中的this

事件绑定有三种方式:行内绑定动态绑定事件监听

行内绑定

<input type="button" value="按钮" onclick="clickFun()">
<script>function clickFun(){this // window}
</script>
​
<input type="button" value="按钮" onclick="this">
<!-- 本节点对象 -->

节点事件属性的值可以是:“可执行的JS代码段”或“函数名(函数调用)

对于οnclick="clickFun()"

  • JS引擎发现onclick的值是函数调用,因此转去<script>标签下(window环境)寻找函数名为“clickFun”的函数,找到clickFun函数后成功执行。此时执行顺序为:“JS引擎 -> <script>标签 -> clickFun()

对于οnclick="this"

  • JS引擎发现onclick的值是一段可执行的js代码,因此JS引擎直接在该DOM节点下执行该代码,对应的this就指向该节点了

动态绑定

<input type="button" value="按钮" id="btn">
<script>var btn = document.getElementById('btn');btn.onclick = function(){this ;  // this指向btn节点对象}
</script>

这里的操作,本质上是直接对btn节点对象的onclick属性附一个值

当执行时,JS引擎发现onclick属性的值是一个匿名函数,因此直接就执行该匿名函数。

又因为该匿名函数的是在btn对象之下执行的,因此this执行btn节点对象

window定时器中的this

var obj = {fun:function(){this ;}
}
​
setInterval(obj.fun,1000);      // window对象
setInterval('obj.fun()',1000);  // obj对象

对于obj.fun:

注意:在这里有一个很重要的点,这里传入的是obj.fun,而不是obj.fun(),传递obj.fun是传入的fun这个方法函数(可以理解为传入fun的值,而fun的值是一个匿名函数,即匿名函数的地址)。而obj.fun是直接调用obj.fun()方法

  • 在经过1s后,JS引擎发现setInerval的第一个参数值是一个函数地址,因此转而去执行该函数。但由于setInterval是一个异步函数,在等待时,会将该代码段挂载到全局对象(window对象)下的一个栈中,因此执行过程为:“JS引擎 -> window对象下的栈 -> 匿名函数”,故this指向window对象

对于'obj.fun()'

  • 在经过1s后,JS引擎发现setInterval的第一个参数值是一段可执行的JS代码,转而执行这个代码,这个代码是调用obj.fun()对象,因此JS引擎去<script>标签(window)下找到obj对象,在找到fun方法,最后执行匿名函数。因此执行过程为:“JS引擎 -> window对象 -> obj对象 -> 匿名函数”,故this指向obj对象

相关文章:

【二】JavaScript能力提升---this对象

目录 this的理解 this的原理 事件绑定中的this 行内绑定 动态绑定 window定时器中的this 相信小伙伴们看完这篇文章&#xff0c;对于this的对象可以有一个很大的提升&#xff01; this的理解 对于this指针&#xff0c;可以先记住以下两点&#xff1a; this永远指向一个…...

YC 孵化项目 Pinch:实时语音翻译视频会议平台;Mistral OCR:能处理多语言多模态复杂文档丨日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 …...

OSPF报文分析

OSPF报文分析 组播地址 224.0.0.0&#xff5e;224.0.0.255为预留的组播地址&#xff08;永久组地址&#xff09;&#xff0c;地址224.0.0.0保留不做分配&#xff0c;其它地址供路由协议使用&#xff1b; 224.0.1.0&#xff5e;238.255.255.255为用户可用的组播地址&#xff08;…...

蓝桥杯刷题周计划(第二周)

目录 前言题目一题目代码题解分析 题目二题目代码题解分析 题目三题目代码题解分析 题目四题目代码题解分析 题目五题目代码题解分析 题目六题目代码题解分析 题目七题目代码题解分析 题目八题目题解分析 题目九题目代码题解分析 题目十题目代码题解分析 题目十一题目代码题解分…...

PH热榜 | 2025-03-09

1. ResumeUp 2.0 标语&#xff1a;聊聊&#xff0c;几分钟内就能帮助你打造完美的ATS简历。 介绍&#xff1a;告别为写完美简历而烦恼的日子吧&#xff01;只需与人工智能聊天&#xff0c;回答几个简单的问题&#xff0c;就能在几分钟内生成强有力的简历&#xff0c;不仅能通…...

《gradio :AI demos》

《gradio &#xff1a;AI demos》 Folders and files Name Last commit message Last commit date parent directory .. agent_chatbot Declare exports in __all__ for type checking (#10238) 3 months ago all_demos Fix deployed Spaces (#10271) 2 months ago …...

Interop_UdsProtocolStack之数据解析器使用方法

一、背景与需求 在汽车电子领域&#xff0c;UDS&#xff08;Unified Diagnostic Services&#xff09;协议栈的响应报文解析是实现ECU诊断功能的核心环节。本文提出一种基于配置驱动的通用解析器开发方案&#xff0c;满足以下行业需求&#xff1a; 多协议兼容性&#xff1a;支…...

从0开始完成基于异步服务器的boost搜索引擎

文章目录 前言一、本项目涉及的技术栈和环境二、boost是什么&#xff1f;三、项目的相关背景四、项目的相关原理五、正排索引 vs 倒排索引 - 搜索引擎具体原理六、 编写数据去标签与数据清洗的模块 Parser6.1 下载boost的文档库6.2 去标签6.3 代码编写 七、索引模块7.1. 整体框…...

炒菜本质是 “能量(火候)与食材特性”的动态平衡

炒菜看似简单&#xff0c;但想要做到色香味俱全&#xff0c;需遵循一套清晰的逻辑链条。以下从底层逻辑到实操步骤拆解&#xff1a; 一、核心逻辑&#xff1a;控制变量&#xff0c;精准匹配 炒菜本质是 “能量&#xff08;火候&#xff09;与食材特性”的动态平衡&#xff0c;…...

AI Copilot——维新派的贾维斯,守旧派的墓志铭(程序员视角)

6500万年前的那颗陨石好像要落下来了 这一段时间&#xff0c;伴随着claude sonnet 3.7的发布 以及cursor&#xff0c;windsurf 等一众AI智能编辑器的涌现&#xff0c;社区的programming自媒体坐不住了&#xff0c;有一个观点已经快要溢出屏幕&#xff1a;程序员这个岗位要黄&a…...

Java Spring MVC (2)

常见的Request Controller 和 Response Controller 的区别 用餐厅点餐来理解 想象你去一家餐厅吃饭&#xff1a; Request Controller&#xff08;接单员&#xff09;&#xff1a;负责处理你的点餐请求&#xff0c;记录你的口味、桌号等信息。Response Controller&#xff08…...

对开源VLA sota π0的微调——如何基于各种开源数据集、以及你自己的私有数据集微调π0(含我司的微调实践)

前言 25年2.4日&#xff0c;几个月前推出π0的公司Physical Intelligence (π)宣布正式开源π0及π0-FAST&#xff0c;如之前所介绍的&#xff0c;他们对用超过 10,000 小时的机器人数据进行了预训练 该GitHub代码仓库「 π0及π0-FAST的GitHub地址&#xff1a;github.com/Ph…...

[排序算法]直接插入排序

1.基本思想 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列。 实际中我们玩扑克牌时&#xff0c;就用…...

四、云原生应用监控-Etcd

Etcd 是 Kubernetes 内部核心组件之一,作为分布式键值存储,天然支持 Prometheus 监控,自带 /metrics 端点,可直接被 Prometheus 抓取。 Etcd监控需要使用到证书。 一、检查云原生Etcd 检查节点上的Etcd [root@k8s-master01 manifests]#netstat -lnpt |grep etcd tcp …...

STM32-I2C通信外设

目录 一&#xff1a;I2C外设简介 二&#xff1a;I2C外设数据收发 三&#xff1a;I2C的复用端口 四&#xff1a;主机发送和接收 五&#xff1a;硬件I2C读写MPU6050 相关函数&#xff1a; 1.I2C_ GenerateSTART 2.I2C_ GenerateSTOP 3.I2C_ AcknowledgeConfig 4.I2C…...

CTA策略【量化理论】

CTA策略演变史 全称&#xff1a;Commodity Trading Advisor &#xff08;商品交易顾问&#xff09; CTA最开始是指通过为客户提供期权、期货方面的交易建议&#xff0c;或者直接通过受管理的期货账户参与实际交易&#xff0c;来获得收益的机构或个人。 随着市场的发展&#…...

基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享

作者&#xff1a;Hello,Panda 各位FPGAer周末愉快&#xff0c;今天熊猫君分享一个基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案。 一、方案背景 先说方案的应用背景&#xff1a;众所周知&#xff0c;较为上层的如基于AI的机器视觉应用&#xff0c;大多基于高端的专用SoC、AI专…...

②Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网

Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网https://item.taobao.com/item.htm?ftt&id784749793551 网关 MS-A1-5081 MS-A1-5081 网关通过 MODBUS TCP 协议与 Modbus RTU/ASCII 协议的相互转换&#xff0c;可以将 Modbus 串口设备接入 MODBUS TCP 网络…...

游戏引擎学习第145天

仓库:https://gitee.com/mrxiao_com/2d_game_3 今天的计划 目前&#xff0c;我们正在完成遗留的工作。当时我们已经将声音混合器&#xff08;sound mixer&#xff09;集成到了 SIMD 中&#xff0c;但由于一个小插曲&#xff0c;没有及时完成循环内部的部分。这个小插曲主要是…...

【Kotlin】Kotlin基础笔记

一、数据类型 1.1 变量声明与类型推导 变量声明 使用 val 声明不可变变量&#xff08;相当于常量&#xff09;&#xff1b;使用 var 声明可变变量。 val a 10 // 类型自动推断为 Int&#xff0c;不可变 var b: Double 5.0 // 显示声明为 Double&#xff0c;可变变量…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

Python爬虫实战:研究Restkit库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...

Linux操作系统共享Windows操作系统的文件

目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项&#xff0c;设置文件夹共享为总是启用&#xff0c;点击添加&#xff0c;可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download&#xff08;这是我共享的文件夹&#xff09;&…...

MLP实战二:MLP 实现图像数字多分类

任务 实战&#xff08;二&#xff09;&#xff1a;MLP 实现图像多分类 基于 mnist 数据集&#xff0c;建立 mlp 模型&#xff0c;实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入&#xff0c;可视化图形数字&#xff1b; 2、完成数据预处理&#xff1a;图像数据维度转换与…...

作为点的对象CenterNet论文阅读

摘要 检测器将图像中的物体表示为轴对齐的边界框。大多数成功的目标检测方法都会枚举几乎完整的潜在目标位置列表&#xff0c;并对每一个位置进行分类。这种做法既浪费又低效&#xff0c;并且需要额外的后处理。在本文中&#xff0c;我们采取了不同的方法。我们将物体建模为单…...