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

news2024/12/22 19:02:22

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.coloradmin.cn/o/2080794.html

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

相关文章

基于ssm+vue+uniapp的农业电商服务系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

代码随想录算法训练营第四十一天 | 121. 买卖股票的最佳时机 , 122.买卖股票的最佳时机II , 123.买卖股票的最佳时机III

目录 121. 买卖股票的最佳时机 思路 暴力 贪心 动态规划 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义 2.确定递推公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数组 方法一&#xff1a; 贪心 方法二&#xff1a;动态规划1 方法三&#xf…

使用rqt_console和roslaunch

1.使用rqt_console和rqt_logger_level rosrun rqt_console rqt_console 执行完该命令后有如下界面: 继续执行如下命令: rosrun rqt_logger_level rqt_logger_level 此时有如下新界面: 接下来继续运行如下命令: rosrun turtlesim turtlesim_node 上面第一…

慢sql问题解决,sql优化,数据库(mysql)

文章目录 1、count效率比较2、作者遇到的慢sql问题2.1、使用排序导致变慢问题2.2、使用LEFT JOIN 导致索引失效的问题2.3、子查询导致索引失效 3、explain命令介绍4、阿里云rds数据库&#xff08;mysql的一种&#xff09;主键索引查询很慢问题参考文档 1、count效率比较 所以结…

初识C++(8.27)

用C实现: 提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数. #include <iostream> #include <string>using namespace std;int main() {string str;cout << "请输入一个字符串: ";getline(cin, str…

uni-app - - - - - 使用uview-plus详细步骤

uni-app - - - - - 使用uview-plus详细步骤 1. 使用HbuilderX创建空白项目2. 安装插件3. uview-plus配置使用3.1 main.js配置3.2 uni.scss配置3.3 App.vue配置3.4 pages.json 4. 重启Hbuilderx 1. 使用HbuilderX创建空白项目 2. 安装插件 工具 > 插件安装 > 前往插件市场…

用Python探究两组变量的相关性_典型相关分析(CCA)模板

典型相关分析&#xff08;Canonical Correlation Analysis, CCA&#xff09;是一种多变量统计分析方法&#xff0c;用于研究两组变量之间的整体相关性。它的基本原理是在两组变量中分别提取有代表性的两个综合变量&#xff08;即两组变量的线性组合&#xff09;&#xff0c;通过…

Java设计模式之工厂模式详细讲解和案例示范

在Java的设计模式中&#xff0c;工厂模式&#xff08;Factory Pattern&#xff09;是最常见和最有用的一种创建型模式。工厂模式的核心思想是将对象的创建与使用分离&#xff0c;从而提供了一种灵活的方式来创建不同类型的对象。这种模式尤其适用于复杂对象的创建过程&#xff…

HTTrack镜像网站实践

目录 前言 Windows下使用HTTrack HTTrack安装 HTTrack使用 Kali linux下使用HTTrack HTTrack安装 HTTrack使用 前言 在特殊时期&#xff0c;不想把真实的网站页面展示给用户&#xff0c;但又不能关停。此刻&#xff0c;可以用镜像网站替换真实网站&#xff0c;降低安全风…

Golang | Leetcode Golang题解之第378题有序矩阵中第K小的元素

题目&#xff1a; 题解&#xff1a; func kthSmallest(matrix [][]int, k int) int {n : len(matrix)left, right : matrix[0][0], matrix[n-1][n-1]for left < right {mid : left (right - left) / 2if check(matrix, mid, k, n) {right mid} else {left mid 1}}retur…

52.给定一个整数 n,实现一个算法返回 n 皇后不同的解决方案的数量

52. N-Queens II 题目 n皇后问题是指将n个皇后放置在一个nn的棋盘上,使得任意两个皇后不在同一行、同一列或同一对角线上。 给定一个整数 n,返回 n 皇后问题不同的解法数量。 示例: 输入: 4 输出: 2 解释: 4皇后问题有如下两个不同的解法: [ [“.Q…”, // 解法 1 “……

LabVIEW反编译与源程序加密破解

最近&#xff0c;不少粉丝咨询如何将生成的 LabVIEW 可执行程序反编译&#xff0c;所以写了这篇文章来详细探讨这个话题。反编译问题引起了广泛的关注&#xff0c;许多开发者希望能够从现有的可执行文件中提取源代码&#xff0c;以便进行修改或重新利用。然而&#xff0c;反编译…

Java基础:什么是多态

什么是多态 多态是面向对象的三大特性之一&#xff08;另外两个是封装和继承&#xff09;&#xff0c;指的是同一个方法能执行不同的行为&#xff0c;在代码上的体现是&#xff1a;声明为父类的对象&#xff0c;可以被不同的实现类赋值&#xff0c;其中实现类必须继承或者实现…

OpenCV图像拼接多频段融合源码重构

OpenCV图像拼接多频段融合源码重构 图像拼接是计算机视觉中的一个常见问题&#xff0c;OpenCV提供了十分完善的算法类库。作者使用OpenCV4.6.0进行图像拼接&#xff0c;其提供了包括曝光补偿、最佳缝合线检测以及多频段融合等图像拼接常用算法&#xff0c;测试发现多频段融合算…

uni-app - - - - - 自定义tabbar

uni-app - - - - - 自定义tabbar 1. 创建页面2. pages.json3. 自定义tabbar4. 隐藏原生tabbar5. 全局注册组件6. 页面使用7. 效果图展示 1. 创建页面 2. pages.json 配置tabbar {"tabBar": {"list": [{"pagePath": "pages/ballroom/ballr…

认知杂谈25

今天分享 有人说的一段争议性的话 I I 《拖延症&#xff0c;谁都有过》 嘿&#xff0c;朋友们&#xff01;咱都来说说&#xff0c;拖延症这玩意儿&#xff0c;好多人都被它给缠上啦。你看哈&#xff0c;本来计划得好好的&#xff0c;今天要把房间收拾得干干净净&#xff0c;可…

SSH弱口令爆破服务器

一、实验背景 1、概述 使用kali的hydra进行ssh弱口令爆破&#xff0c;获得服务器的用户名和口令&#xff0c;通过 ssh远程登录服务器。 2、实验环境 kali攻击机&#xff1a;192.168.1.107 centos服务器&#xff1a;192.168.1.105 二、前置知识 1、centos设置用户并设置弱…

软件设计原则之接口隔离原则

接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09;是面向对象设计中的一个重要原则&#xff0c;它属于SOLID原则之一。这个原则强调客户端&#xff08;即接口的调用者&#xff09;不应该被迫依赖于它们不使用的方法。换句话说&#xff0c;一个类对另一…

【区块链 + 司法存证】数据存证区块链服务开放平台 | FISCO BCOS应用案例

大数据时代&#xff0c;数据参与社会生产过程&#xff0c;实现价值增值&#xff0c;是一种新型生产要素。数据产品具有易复制、易修改等特点&#xff0c; 因而数据产品在使用、流通过程中面临被非法复制、非法传播、非法篡改和知识产权窃取等安全风险。在存证数 据上链过程中&a…

PDF转化为机器可读格式的工具

MinerU PDF转化为机器可读格式的工具 项目简介 MinerU是一款将PDF转化为机器可读格式的工具&#xff08;如markdown、json&#xff09;&#xff0c;可以很方便地抽取为任意格式。 项目地址&#xff1a; https://github.com/opendatalab/MinerU/tree/master主要功能 删除页…