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

解析经典面试题: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 ,最终引用不同的变量实例

http://www.lryc.cn/news/145872.html

相关文章:

  • CSS按钮-跑马灯边框
  • 【PCIE系统学习】Gen1/2Gen3/4 symobl与OrderSet概念对比
  • C++ Qt 中QMimeDatabase类详细介绍以及应用场景
  • 深度学习7:生成对抗网络 – Generative Adversarial Networks | GAN
  • R语言空气污染数据的地理空间可视化和分析:颗粒物2.5(PM2.5)和空气质量指数(AQI)...
  • 实现excel导出最简单方式
  • 【每日一题Day310】LC1654到家的最少跳跃次数 | BFS
  • [Android AIDL] --- AIDL原理简析
  • 企业的固定资产管理怎么操作
  • Rust 进阶学习
  • 保护网站安全:学习蓝莲花的安装和使用,复现跨站脚本攻击漏洞及XSS接收平台
  • Redis——如何解决redis穿透、雪崩、击穿问题
  • MySQL一行记录是如何存储的?
  • [element-ui] el-tree全部展开与收回
  • git 统计(命令)
  • 斐波那契1(矩阵快速幂加速递推,斐波那契前n项平方和)
  • minikube mac 启动
  • 从零开始学习 Java:简单易懂的入门指南之查找算法及排序算法(二十)
  • 非煤矿山风险监测预警算法 yolov8
  • Ansible学习笔记(一)
  • 2024毕业设计选题指南【附选题大全】
  • Error: PostCSS plugin autoprefixer requires PostCSS 8 问题解决办法
  • pymongo通过oplog获取数据(mongodb)
  • MySQL数据备份与恢复
  • 基于ssm+vue汽车售票网站源码和论文
  • 【List】List集合有序测试案例:ArrayList,LinkedList,Vector(123)
  • 【javaweb】学习日记Day6 - Mysql 数据库 DDL DML
  • 使用 PyTorch C ++前端
  • 6、NoSQL的四大分类
  • (动态规划) 剑指 Offer 60. n个骰子的点数 ——【Leetcode每日一题】