解析经典面试题:for 循环中的 let var
更多文章可以看看我的博客:https://icheng.github.io/
题目
for循环中,使用 var 或 let 声明 i 变量,会得到不同的结果
var arr = [];
for (var i = 0; i < 2; i++) {arr[i] = function () {console.log(i);}
}
arr[0]();
arr[1]();
输出:
2
2
var arr = [];
for (let i = 0; i < 2; i++) {arr[i] = function () {console.log(i);}
}
arr[0]();
arr[1]();
输出:
0
1
这是为什么?
解析
首先我们都知道 js 的全局作用域、局部作用域
全局作用域
var 声明在函数体外,属于全局作用域
即意味着:
全局只有一个 i 变量
if (true) {var name = '123';
}
console.log(name); // 输出 '123'
局部作用域
let 声明的变量,属于局部作用域
即意味着:
该变量在 { } 内是有效的
if (true) {let name = '123';
}
console.log(name); // 没有定义
for 循环中 定义 var 发生了什么
每一轮循环,将 function 添加到数组,function 是
function () {console.log(i);
}
因为使用 var 定义 i 变量,所以全局只有一个 i
因此每一轮循环,是全局的这一个 i 在增加
当退出循环后,i = 2
最终执行
arr[0]()
arr[1]()
执行对应的函数
console.log(i);
所以输出:
2
2
所以关键是:
函数是最后执行的,此时函数去找当前的全局变量 i ,是2

for 循环中 定义 let 发生了什么
红宝书上是这样形容的:因为使用 let 定义变量 i,每轮迭代循环时,JS引擎在后台会声明一个新的迭代变量
所以:每个 console.log(i) ,引用的 i 都是不同的变量实例

最终执行函数时,使用自己块级作用域的变量 i
所以输出为:
0
1
所以关键是:
每次循环都会在自己的块级作用域 { } 有变量 i ,最终引用不同的变量实例
相关文章:
解析经典面试题:for 循环中的 let var
更多文章可以看看我的博客:https://icheng.github.io/ 题目 for循环中,使用 var 或 let 声明 i 变量,会得到不同的结果 var arr []; for (var i 0; i < 2; i) {arr[i] function () {console.log(i);} } arr[0](); arr[1]();输出&…...
CSS按钮-跑马灯边框
思路很简单,实现方法有很多很多。但是大体思路与实现方法都类似:渐变色 动画,主要区别在动画的具体实现 0、HTML 结构 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><titl…...
【PCIE系统学习】Gen1/2Gen3/4 symobl与OrderSet概念对比
这个专栏要干的事:学习PCIE理论知识,学会PCIE IP/VIP的使用。可以达到上手做项目,而不是空有理论 适合谁看:正在学习PCIE 设计验证,但学的过于零散。想有对比的系统的学习。 低价收费的目的:抵制胡乱传播转载现象。 版本控制:便于增加内容以及勘误 版本说明v20230829 …...
C++ Qt 中QMimeDatabase类详细介绍以及应用场景
C Qt 中QMimeDatabase类详细介绍以及应用场景 文章目录 C Qt 中QMimeDatabase类详细介绍以及应用场景一、QMimeDatabase类是什么?二、QMimeDatabase类中的关键功能和特点三、QMimeDatabase的用法四、QMimeDatabase的应用场景 一、QMimeDatabase类是什么?…...
深度学习7:生成对抗网络 – Generative Adversarial Networks | GAN
生成对抗网络 – GAN 是最近2年很热门的一种无监督算法,他能生成出非常逼真的照片,图像甚至视频。我们手机里的照片处理软件中就会使用到它。 目录 生成对抗网络 GAN 的基本原理 大白话版本 非大白话版本 第一阶段:固定「判别器D」&#x…...
R语言空气污染数据的地理空间可视化和分析:颗粒物2.5(PM2.5)和空气质量指数(AQI)...
原文链接:http://tecdat.cn/?p23800 由于空气污染对公众健康的不利影响,人们一直非常关注。世界各国的环境部门都通过各种方法(例如地面观测网络)来监测和评估空气污染问题(点击文末“阅读原文”获取完整代码数据&…...
实现excel导出最简单方式
今天来记录一下导出excel的实现方式,导出的格式是xlsx的文件。 这里用到的是hutool的工具包,依赖如下: <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.5&…...
【每日一题Day310】LC1654到家的最少跳跃次数 | BFS
到家的最少跳跃次数【LC1654】 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发,到达它的家。 跳蚤跳跃的规则如下: 它可以 往前 跳恰好 a 个位置(即往右跳)。它可以 往后 跳恰好 b 个位置(即往左跳&…...
[Android AIDL] --- AIDL原理简析
上一篇文章已经讲述了如何在Android studio中搭建基于aidl的cs模型框架,只是用起来了,这次对aidl及cs端如何调用的原理进行简单分析 1 创建AIDL文件 AIDL 文件可以分为两类。 一类是用来定义接口方法,声明要暴露哪些接口给客户端调用&#…...
企业的固定资产管理怎么操作
一家拥有多台大型设备的工厂,这些设备需要定期进行保养和维护,以确保其正常运转。而企业内部员工由于专业知识和技能的不同,需要分工协作才能更好地完成各项工作任务。因此,在设备资产管理方面,如何实现高效、便捷、透…...
Rust 进阶学习
Rust 进阶学习 文章目录 Rust 进阶学习所有权作用域移动和克隆涉及函数的所有权机制涉及参数的所有权涉及返回值的所有权 引用和租借可变引用 枚举类枚举成员的属性枚举匹配 结构体结构体方法结构体关联函数 错误处理不可恢复错误可恢复错误 Rust代码组织管理Module默认的Modul…...
保护网站安全:学习蓝莲花的安装和使用,复现跨站脚本攻击漏洞及XSS接收平台
这篇文章旨在用于网络安全学习,请勿进行任何非法行为,否则后果自负。 环境准备 一、XSS基础 1、反射型XSS 攻击介绍 原理 攻击者通过向目标网站提交包含恶意脚本的请求,然后将该恶意脚本注入到响应页面中,使其他用户在查看…...
Redis——如何解决redis穿透、雪崩、击穿问题
目录 一、查询商品信息的常规代码示例二、缓存击穿2.1、缓存击穿的理解2.2、缓存击穿的解决方案2.3、解决缓存击穿的代码示例 三、缓存雪崩3.1、缓存雪崩的理解3.2、缓存雪崩的解决方案3.2.1、缓存集中过期的情况3.2.2、缓存服务器宕机的情况3.2.3、缓存服务器断电的情况 3.3、…...
MySQL一行记录是如何存储的?
目录 MySQL的数据存放在哪个文件? 表空间文件的结构是怎么样的? 1、行(row) 2、页(page) 3、区(extent) 4、段(segment) InnoDB 行格式有哪些…...
[element-ui] el-tree全部展开与收回
shrinkTreeNode () {// 改变一个全局变量this.treeStatus !this.treeStatus;// 改变每个节点的状态this.changeTreeNodeStatus(this.$refs.attrList.store.root); },// 改变节点的状态 changeTreeNodeStatus (node) {node.expanded this.treeStatus;for (let i 0; i < no…...
git 统计(命令)
查询某人某个时刻提交了多少代码 added 添加代码 removed 删除代码 total 总代码 git log --author刘俊秦 --since2023-08-01 00:00:00 --until2023-08-23 23:00:00 --prettytformat: --numstat | awk { add $1; subs $2; loc $1 - $2 } END { printf "added lines: %s…...
斐波那契1(矩阵快速幂加速递推,斐波那契前n项平方和)
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 Keven 特别喜欢斐波那契数列,已知 fib11fib_11fib11,fib21fib_21fib21,对于 n>3n>3n>3,fibnfibn−2fibn−1fib_{n}fib_{n-2}fib_{n…...
minikube mac 启动
系统信息如下 最开始使用的minikube是1.22.0版本,按照如下命令启动: minikube start --memory7851 --cpus4 --image-mirror-countrycn遇到了下面一些问题: 1、拉取coredns:v1.8.0镜像失败 Error response from daemon: manifest for regis…...
从零开始学习 Java:简单易懂的入门指南之查找算法及排序算法(二十)
查找算法及排序算法 常见的七种查找算法:1. 基本查找2. 二分查找3. 插值查找4. 斐波那契查找5. 分块查找6. 哈希查找7. 树表查找 四种排序算法:1. 冒泡排序1.1 算法步骤1.2 动图演示1.3 代码示例 2. 选择排序2.1 算法步骤2.2 动图演示 3. 插入排序3.1 算…...
非煤矿山风险监测预警算法 yolov8
非煤矿山风险监测预警算法通过yolov8网络模型深度学习算法框架,非煤矿山风险监测预警算法在煤矿关键地点安装摄像机等设备利用智能化视频识别技术,能够实时分析人员出入井口的情况,人数变化并检测作业状态。YOLO的结构非常简单,就…...
别再只抄datasheet了!TPS5430降压电路PCB布局的5个实战避坑点(附15V转12V/负压案例)
TPS5430降压电路PCB布局的5个实战避坑指南:从理论到15V转12V/负压案例 在硬件设计领域,TPS5430作为一款经典的Buck型DC-DC转换芯片,其性能表现与PCB布局质量密切相关。许多工程师虽然能正确绘制原理图,却在PCB实现阶段因忽视关键…...
一机多版本Quartus共存?教你修复USB Blaster识别冲突(修改JTAG服务路径详解)
多版本Quartus共存时的USB Blaster识别冲突解决方案 当我们需要在同一台电脑上安装多个版本的Quartus软件时(比如为了兼容不同时期的FPGA项目),经常会遇到一个棘手问题:USB Blaster无法被正确识别。这种情况通常发生在安装了新旧两…...
51单片机电子秤的语音播报怎么选?JQ8400模块 vs OTP芯片,实测成本与易用性对比
51单片机电子秤语音方案实战选型:JQ8400模块与OTP芯片的深度拆解 在智能硬件开发中,语音交互功能正从锦上添花的附加项逐渐变为核心用户体验的关键组成部分。以51单片机电子秤为例,语音播报功能不仅能提升产品的无障碍使用体验,还…...
3天掌握Dify工作流开发:从零构建企业级AI应用的完整指南
3天掌握Dify工作流开发:从零构建企业级AI应用的完整指南 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dif…...
别再为VMware里Kali上不了网发愁了!三种网络模式(桥接/NAT/仅主机)保姆级配置与排错指南
VMware中Kali Linux网络配置全攻略:从原理到实战排错 当你第一次在VMware中启动Kali Linux准备大展身手时,却发现连最基本的网络连接都无法建立——这种挫败感我深有体会。作为网络安全学习和渗透测试的必备工具,Kali在虚拟机中的网络配置往往…...
废水污染源在线监测管理平台方案
某企业从事染整加工生产,属于环境监管重点单位,安装有废水自动处理系统,监控因子包括PH值、化学需氧量、氨氮、总氮等。但在某次巡查工作时发现,化学需氧量远远超过排放标准,但涉事企业却未上报排放超标的情况。因此要…...
Jenkins 安装Publish over SSH插件远程发布执行shell脚本
1.在jenkins安装Publish over SSH插件,在Manage Jenkins–Plugins–Available plugins中搜索Publish over SSH,然后安装即可。2.安装成功以后,需要到系统设置DashBoard—Manage Jenkins—System中进行配置,如图 可以通过密码链接也…...
2026年想快速提分?邵阳这些高复学校或许能帮你实现梦想!
高考失利并不意味着人生就此止步,复读是很多考生重新冲刺梦想的选择。在邵阳,有不少优秀的高复学校,今天就重点为大家介绍邵阳湘郡铭志学校高复部,同时也会提及其他一些知名高复学校,帮助大家在选择时进行对比。一、解…...
AArch64虚拟内存系统架构与64KB粒度地址转换详解
1. AArch64虚拟内存系统架构概述现代处理器架构通过虚拟内存机制实现物理内存与虚拟地址空间的隔离映射,AArch64作为ARMv8/ARMv9架构的64位执行状态,其虚拟内存系统架构(VMSA)采用多级页表机制实现地址转换。与传统x86架构相比&am…...
别再手动调相机了!用CinemachineFreeLook快速搞定Unity第三人称视角(附完整配置流程)
告别繁琐调试:用CinemachineFreeLook打造专业级Unity第三人称视角 在游戏开发中,第三人称视角的实现往往让开发者头疼不已。传统的手动摄像机控制不仅需要编写大量代码来处理跟随、旋转和碰撞检测,还容易产生抖动、穿模等恼人的问题。而Unity…...
