ES6中var和let的作用域问题

devtools/2024/10/18 5:39:00/

问题引出:下面的代码输出结果什么?

for (var i = 0; i < 5; i++) {setTimeout(() => {console.log(i);}, 1000);
}

答案:6个5。
解析:根本原因是在这段代码中,var关键字的作用域是函数作用域
外层的for循环一共执行了五次,生成了五个定时器,每个定时器输出变量i的值。相当于如下的代码:

javascript">{var i = 0;setTimeout(() => {console.log(i);});
}
{var i = 1;setTimeout(() => {console.log(i);});
}
{var i = 2;setTimeout(() => {console.log(i);});
}
{var i = 3;setTimeout(() => {console.log(i);});
}
{var i = 4;setTimeout(() => {console.log(i);});
}
{var i = 5;
}

js中同步代码块先执行,所以当定时器执行的时候,i变量已经变成5了,又由于var关键字的函数作用域,所以所有的定时器输出的结果都是5。

如果将上述var关键字改成let关键字,则代码会依次输出0,1,2,3,4。

javascript">for (let i = 0; i < 5; i++) {setTimeout(() => {console.log(i);}, 1000);
}

这是因为let关键字是块级作用域,所以上述代码的拆分是这样的:

javascript">{let i = 0;setTimeout(() => {console.log(i);}, 1000);
}{let i = 1;setTimeout(() => {console.log(i);}, 1000);
}
{let i = 2;setTimeout(() => {console.log(i);}, 1000);
}{let i = 3;setTimeout(() => {console.log(i);}, 1000);
}
{let i = 4;setTimeout(() => {console.log(i);}, 1000);
}
{let i = 5;
}

每个定时器只读取块级作用域中的i,自然会依次输出01234。


http://www.ppmy.cn/devtools/56453.html

相关文章

2024HVV最新POC/EXP,目前有8000+个POC/EXP

点击"仙网攻城狮”关注我们哦~ 不当想研发的渗透人不是好运维 让我们每天进步一点点 简介 都是网上收集的POC和EXP&#xff0c;最新收集时间是2024年五月&#xff0c;需要的自取。 表里没有的可以翻翻之前的文章&#xff0c;资源比较零散没有整合起来。 文件链接&#xff…

JS逆向:由 words 、sigBytes 引发的一系列思考与实践

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 在做JS逆向时&#xff0c;你是否经常看到 words 和 sigBytes 这两个属性呢&#xff0c;比如&#xff…

RabbitMQ实践——搭建单人聊天服务

大纲 创建Core交换器用户登录发起聊天邀请接受邀请聊天实验过程总结代码工程 经过之前的若干节的学习&#xff0c;我们基本掌握了Rabbitmq各个组件和功能。本文我们将使用之前的知识搭建一个简单的单人聊天服务。 基本结构如下。为了避免Server有太多连线导致杂乱&#xff0c;下…

C语言单链表的算法之插入节点

一&#xff1a;访问各个节点中的数据 &#xff08;1&#xff09;访问链表中的各个节点的有效数据&#xff0c;这个访问必须注意不能使用p、p1、p2&#xff0c;而只能使用phead &#xff08;2&#xff09;只能用头指针不能用各个节点自己的指针。因为在实际当中我们保存链表的时…

小脚本:文件保存后,自动上传到git

闲来无事写写小脚本 假设已经有一个脚本 echo off:START :: 获取当前脚本的路径 cd /d %~dp0:: 清空提交注释变量的值 set commit_msg:: 提示用户输入提交注释 set /p commit_msg请输入提交注释&#xff08;输入 n 退出&#xff09;::: 如果用户输入内容为 n&#xff0c;则退出…

three.js - matcap材质(MeshMatcapMaterial)

说一下matcap纹理 先总结&#xff1a;MeshMatcapMaterial材质&#xff0c;通过采样含有光照信息的贴图来模拟光照效果。这种材质特别适用于模拟静态光源下的光照&#xff0c;并且&#xff0c;因其简单性和快速性而被广泛应用于各种场景。但是&#xff0c;由于其性能考虑&#x…

el-tree结构清空选中节点

<el-tree:data"data"show-checkboxdefault-expand-allnode-key"id"ref"tree"highlight-current:props"defaultProps"> </el-tree>this.$refs.tree.setCheckedKeys(this.$refs.tree.getCheckedNodes(),false);

【C++笔记整理—第1期】

C笔记整理 本系列是C语言基础语法的学习笔记整理。 文章目录 C笔记整理结构体定义及初始化结构体数组用指向结构体变量的指针构成链表函数传参的三种形式动态分配和撤销内存空间用typedef声明新的类型名 类和对象概述特点面向对象的软件工程 类的声明和对象的定义声明类类型 …