JS中this的指向问题、JS的执行机制、offset、client、scroll

JS中this的指向问题

1. 在全局环境下

在全局环境中(在浏览器中是 window 对象,在Node.js中是 global 对象),this 指向全局对象。

console.log(this === window); // 在浏览器中为 true console.log(this.document !== undefined); // 在浏览器中为 true

2. 作为对象的方法

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

var obj = { 
x: 42, 
getX: function() { 
return this.x; 
} 
}; console.log(obj.getX()); // 输出 42,此时 this 指向 obj

3. 函数作为构造函数

当函数使用 new 关键字被调用时,该函数作为构造函数,this 被绑定到新创建的对象上。

function Person(name) { 
this.name = name; 
} var person = new Person("Alice"); 
console.log(person.name); // 输出 Alice
//this指向person

4. 箭头函数

箭头函数不绑定自己的 this,它会继承外围作用域的this

var obj = { 
x: 42, 
getX: function() { 
return () => this.x; 
} 
}; console.log(obj.getX()()); // 输出 42,因为箭头函数捕获了 getX 方法中的 this(即 obj)

5. 显式设置 thiscallapplybind

Function.prototype.call()Function.prototype.apply(), 和 Function.prototype.bind() 方法允许你显式设置 this 的值。

  • call 方法接受一个 this 值和一个参数列表。
  • apply 方法接受一个 this 值和一个包含多个参数的数组。
  • bind 方法返回一个新函数,在 bind 被调用时,这个新函数的 this 被指定为 bind 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。
function greet() { 
return "Hello, " + this.name; 
} var obj = { name: "Alice" }; console.log(greet.call(obj)); // 输出 "Hello, Alice" 
console.log(greet.apply(obj)); // 输出 "Hello, Alice" var boundGreet = greet.bind(obj); 
console.log(boundGreet()); // 输出 "Hello, Alice"

JS的执行机制

1. 调用栈(Call Stack)

调用栈是 JavaScript 代码执行时用来存储函数调用信息的数据结构。每当一个函数被调用时,它的信息(包括参数和局部变量)就会被推入调用栈的顶部。当函数执行完成后,它的信息就会被从调用栈中弹出,控制权就回到了前一个函数(即调用者)。

如果调用栈中的函数太多,导致调用栈过大,就会引发“栈溢出”(Stack Overflow)错误。

2. 事件循环(Event Loop)

JavaScript 是单线程的,这意味着它一次只能执行一个任务。然而,JavaScript 需要能够处理异步操作(如网络请求、文件读取等),这些操作可能会花费很长时间才能完成。为了实现这一点,JavaScript 使用了事件循环。

事件循环允许 JavaScript 执行代码块,将耗时任务(如 I/O 操作)推送到“任务队列”(Task Queue)中,然后继续执行其他代码。一旦调用栈为空(即当前没有正在执行的代码),事件循环就会从任务队列中取出任务,并将其推送到调用栈中执行。

3. 宏任务(MacroTask)与微任务(MicroTask)

任务队列实际上可以进一步细分为宏任务队列和微任务队列。

  • 宏任务:包括整体代码执行、setTimeoutsetIntervalsetImmediate(Node.js 独有)、I/O 操作、UI 渲染等。
  • 微任务:包括 Promise.thenMutationObserver(DOM 变更观察者)、process.nextTick(Node.js 独有)等。

在执行过程中,每次从宏任务队列中取出一个任务执行完毕后,会检查并连续执行完所有的微任务队列中的任务,然后再从宏任务队列中取出下一个任务执行。这种机制确保了微任务总是优先于宏任务执行。

4. 异步与同步

JavaScript 的异步操作是通过回调函数、Promises、async/await 等机制实现的。这些机制允许代码在等待某个异步操作完成时继续执行其他任务,从而提高了应用程序的响应性和性能。

元素偏移量offset

offset系列属性作用
offsetWidth 和 offsetHeight返回元素自身,包括元素的内容(content)宽度/高度、内边距(padding)和边框(border),但不包括外边距(margin)和滚动条(如果有的话),返回数值不带单位
offsetLeft 和 offsetTop返回元素相对于其带有定位(position为非static)的父元素(offsetParent)的左边距和上边距的偏移量,如果元素的所有父元素都没有定位,则相对于<body>元素计算偏移量,返回数值不带单位
offsetParent返回作为该元素带有定位的父级元素,如果父级没有定位,则offsetParent为<body><html>元素,返回对象,最近定位的父元素

client系列属性的作用

client系列属性作用
element.clientTop返回元素上边框的大小,值表示顶部边框的宽度,但不包括上内边距(padding-top)或滚动条,返回数值不带单位
element.clientLeft返回元素左边框的大小,表示左边框的宽度,但不包括左内边距(padding-left)或滚动条(返回数值不带单位
element.clientWidth返回元素的内部宽度,包括内边距(padding),但不包括边框(border)、外边距(margin)或滚动条(如果存在且未计算在内),返回数值不带单位
element.clientHeight返回元素的内部宽度,包括内边距(padding),但不包括边框(border)、外边距(margin)或滚动条(如果存在且未计算在内),返回数值不带单位

 scroll系列属性的作用

 scroll系列属性作用
element.scrollTop返回元素在垂直方向上已滚动的像素值。这个值表示元素的上边缘与其可视区域上边缘之间的距离。如果元素未滚动,这个值通常是0,可设置
element.scrollLeft于水平方向上的滚动。返回元素在水平方向上已滚动的像素值。这个值表示元素的左边缘与其可视区域左边缘之间的距离,可设置
element.scrollWidth返回元素的滚动宽度,即包括因滚动而隐藏在浏览器可视区外的内容在内的元素的总宽度。这个值等于元素内容的实际宽度加上内边距(padding),但不包括边框(border)、外边距(margin)或滚动条本身(如果滚动条不占用空间的话),scrollWidth是一个只读属性,不能通过设置来改变其值
element.scrollHeight用于垂直方向上的滚动。返回元素的滚动高度,即包括因滚动而隐藏在浏览器可视区外的内容在内的元素的总高度。这个值等于元素内容的实际高度加上内边距(padding),但不包括边框(border)、外边距(margin)或水平滚动条(如果存在且未计算在内),只读属性,不能通过设置来改变其值

代码示例:

<body><style>.parent{border: 2px solid rgb(182, 115, 115);background-color: #5bca3a;width: 400px;height: 400px;position: relative;padding: 10px;left: 5px;top: 5px;}.parent .child{position: absolute;border: #1287db solid 2px;width: 100px;height: 100px;background-color: #a2d1f3;}
</style><div class="parent"><div class="child"></div></div><script>var child=document.querySelector('.child');console.log(child.offsetLeft,child.offsetTop);  //返回元素在其父节点中的偏移位置// console.log(child.offsetParent.offsetLeft,child.offsetParent.offsetTop); //返回元素的第一个定位先的偏移位置console.log(child.offsetParent);console.log(child.offsetWidth,child.offsetHeight); //返回元素的宽度和高度console.log(child.clientWidth,child.clientHeight); //返回元素的可见宽度和高度console.log(child.scrollWidth,child.scrollHeight); //返回元素的滚动宽度和高度</script>
</body>

 

offset和style的区别

1.获取样式来源

  • style:主要获取元素的内联样式表中的样式值 
  • offset:可以得到任意样式表中的样式值,包括内联样式、嵌入样式和外部样式表中定义的样式。

2.返回值类型不同

  • offset:获取的数值通常没有单位。
  • style:获取带有单位的字符串。

3.属性只包含范围

  • offset:其属性(如offsetWidthoffsetHeight)包含元素的边框(border)、内边距(padding)和内容区域(width/height)的宽度和高度。但通常不包括外边距(margin)和滚动条(除非滚动条占据了内容区域的空间)。
  • stylestyle.widthstyle.height通常只获取或设置内容区域的宽度和高度,不包括边框和内边距

4.可读写性

  • offset:offset系列的属性(如offsetWidthoffsetHeightoffsetLeftoffsetTop等)主要是只读的,用于获取元素的信息,而不能直接通过赋值来改变元素的大小或位置。
  • stylestyle属性下的样式值(如style.widthstyle.height等)通常是可读写的,即可以通过赋值来改变元素的样式。

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

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

相关文章

如何练高音技巧

如何练高音技巧 高音的练习技巧有&#xff1a;练“a”(啊)音&#xff0c;让口腔打开&#xff0c;声带放松&#xff0c;反复几次&#xff1b;再练“u”(呜)音&#xff0c;这个音可以有按摩声带的功能&#xff0c;也使声带进一步放松&#xff1b;发“i”(衣)音&#xff0c;逐步加…

k8s 四种Service类型(ClusterIP、NodePort、LoadBalancer、ExternalName)详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、k8s概述 2、Service在Kubernetes中的…

大模型本地化部署2-Docker部署MaxKB

大模型本地化部署2-Docker部署MaxKB 0、MaxKB简介1、安装docker2、在docker中拉取MaxKB镜像3、运行镜像4、访问MaxKB5、创建应用6、使用应用进行对话 0、MaxKB简介 MaxKB是一款基于LLM大预言模型的知识库问答系统。具有以下特点&#xff1a; 多模型支持&#xff1a;支持对接主…

开放式耳机怎么戴?佩戴舒适在线的几款开放式耳机分享

开放式耳机的佩戴方式与传统的入耳式耳机有所不同&#xff0c;它采用了一种挂耳式的设计&#xff0c;提供了一种新颖的佩戴体验&#xff0c;以下是开放式耳机的佩戴方式。 1. 开箱及外观&#xff1a;首先&#xff0c;从包装盒中取出耳机及其配件&#xff0c;包括耳机本体、充电…

什么是密码学?

什么是密码学&#xff1f; 密码学是一种通过使用编码算法、哈希和签名来保护信息的实践。此信息可以处于静态&#xff08;例如硬盘驱动器上的文件&#xff09;、传输中&#xff08;例如两方或多方之间交换的电子通信&#xff09;或使用中&#xff08;在对数据进行计算时&#…

设计模式-结构性模式-桥接模式

1.桥接模式定义 桥接模式就是将抽象部分与他的实现部分分离&#xff0c;使他们都可以独立的变化&#xff1b; 桥接模式用一种巧妙地方式处理多层继承存在的问题&#xff0c;用抽象关联来取代传统的多层继承&#xff0c;将类之间的静态继承关系转变为动态的组合关系&#xff0c;…

Leetcode JAVA刷刷站(99)恢复二叉搜索树

一、题目概述 二、思路方向 要解决这个问题&#xff0c;我们可以采用中序遍历二叉搜索树&#xff08;BST&#xff09;的方法&#xff0c;因为中序遍历BST会返回一个有序的数组。由于只有两个节点被错误地交换了&#xff0c;所以中序遍历的结果中将有两个位置上的元素是逆序的。…

什么是数据库 DevOps?

原文地址 https://www.bytebase.com/blog/what-is-database-devops/ 在深入研究数据库 DevOps 之前&#xff0c;先回顾一下什么是 DevOps。它没有统一的定义&#xff0c;但我们知道它起源于软件开发方法与部署和运维的结合。 大约 2007 年和 2008 年&#xff0c;软件开发和 I…

.NET8 Web 利用BAT命令 一键部署 IIS - CI-CD基础

1. Windows Server 前置准备 1.1 IIS安装好 1.2 .NET8 Sdk 运行时 安装 官方下载地址&#xff1a;https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0 1.3 创建一个.NET8 WebMvc项目 生成发布包 微软MVC这个项目模板直接创建&#xff0c;发布 2. 利用 BAT 来一键部署…

【STM32】FMC

FMC功能与FSMC类似&#xff0c;但比FSMC更强大&#xff0c;但仅在F4 / F7 / H7等高级一点的MCU上支持&#xff0c;F1不支持。虽然我的是F103&#xff0c;但顺便都看了。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目…

Vue 和 Element Plus 弹框组件详解:从基本实现到异步数据加载与自定义内容(实战)

目录 前言1. 基本知识2. 模版3. 实战 前言 主要是通过一个按钮触发一个按钮框&#xff0c;多种方式的逻辑&#xff0c;多种场景 原先通过实战总结&#xff0c;基本的知识推荐阅读&#xff1a; 详细分析Element Plus中的ElMessageBox弹窗用法&#xff08;附Demo及模版&#x…

秋招复习笔记——嵌入式裸机开发

底层相关的内容&#xff0c;之前掌握的不扎实&#xff0c;现在重新把相关重点记录一下&#xff0c;做个笔记记诵。 相关基础知识 ST简单内容 用的F103ZET6&#xff0c;72MHz&#xff0c;FLASH是512KB&#xff0c;SRAM是64KB&#xff0c;144个引脚&#xff0c;2基本定时器&am…

目标 CDC实例数据库更改密码,预定启动报错SQL 错误代码为“-30082”。SQL 状态为:08001。

更改完CDC目标端实例密码后&#xff0c;登录MC更新存储器密码&#xff0c;存储器可正常连接&#xff0c;启动预定报错如下&#xff1a; 源 IBM Data Replication 未获授权&#xff0c;无法复制到该目标。 登录认证失败。 发生 SQL 异常。SQL 错误代码为“-30082”。SQL 状态…

嵌入式学习——ARM学习(1)

1、存储器 高速缓存&#xff08;Cache&#xff09;通常分为三级&#xff1a;L1、L2 和 L3。它们的主要功能和特点如下&#xff1a; 这三级缓存的设计旨在通过层次化存储来优化数据访问速度和处理器性能。 1、L1 缓存&#xff1a; 位置&#xff1a;直接集成在处理器核心内。 大小…

打手机检测算法源码样本展示打手机检测算法实际应用场景介绍

打手机检测算法是一种利用计算机视觉技术来监测和识别人们在特定区域如驾驶舱、考场或其他敏感区域非法使用手机的行为。这种算法对于提高安全性和确保规则的遵守具有重要意义。以下是关于打手机检测算法源码及其实际应用的详细阐述&#xff1a; 1. 算法实现 - 深度学习框架&a…

【selenium点选下拉框】解决无法选中对应选项的问题

需求 使用selenium点击下拉框&#xff0c;选中【是】选项。 代码 方法1 # 点击下拉框 driver.find_element(xpath,//*[id"basicProcessDetail"]/div[2]/div[2]/div[1]/div/div[2]/div/div/div/div[1]/div[2]/form/div[11]/div[1]/div/div/div[1]/div[1]/div/i).…

雷达图概述以及实例

目录 一.雷达图概述1.何为雷达图2.雷达图的构成要素 二.实例&#xff08;以Excel、Python为例 &#xff09;1.Excel&#xff08;2021版&#xff09;2.Python 一.雷达图概述 1.何为雷达图 雷达图&#xff0c;是一种展现多维度数据间相对重要性或程度的可视化图形。以中心点为起…

LabVIEW高速数据采集关键问题

在LabVIEW进行高速数据采集时&#xff0c;需要关注以下几个关键问题&#xff1a; 数据采集硬件的选择: 高速数据采集需要高性能的数据采集硬件&#xff0c;例如NI PXIe、USB DAQ等模块。硬件的选择应根据采集速率、通道数、精度、以及应用场景的具体需求来确定。 采集速率与带…

ByteBuffer详解

文章目录 1. ByteBuffer是抽象类&#xff0c;他的主要实现类为2. 获取方式3. 核心结构4. 核心API5. 字符串操作 1. ByteBuffer是抽象类&#xff0c;他的主要实现类为 HeapByteBuffer 堆ByteBuffer JVM内的堆内存 —> 读写操作 效率低 会受到GC影响MappedByteBuffer(DirectB…

桥接模式-多类型登录方式的思考

桥接模式-SSO单点登录 背景:(业务细节已脱敏)需求:问题:解决方式: OAuth2.0 实现单点登录四种授权模式桥接模式优化问题代码实现 背景:(业务细节已脱敏) 基于实习期间的一个代码重构的思考——业务细节已脱敏 基于内部旧框架实现业务toB管理系统&#xff0c;需要迁移数据并新的…