关于let你不知道的知识点——红宝石书笔记记录
let与var的区别
关于let和var的区别可能大家都知道了,主要有以下几点:
1、var没有块级作用域(但有函数作用域),而let有块级作用域。
2、var存在变量提升,而let没有变量提升。
3、var可以声明重名的变量,let不可以声明重名的变量。
for循环中的let声明
1、解决循环遍历渗透到外部的缺点
看下面两段代码:
for(var i = 0; i < 5; i++){console.log('--------');}console.log(i);// 5
这段代码输出的i是5,原因是var声明的变量没有块级作用域。
for(let i = 0; i < 5; i++){console.log('--------');}console.log(i); // ReferenceError: i is not defined
这段代码结果是ReferenceError,原因是let声明的变量有块级作用域。
说这一点的原因是,大家以后在用for循环时,尽量用let来声明循环变量,因为指不定以后写代码时一不小心就在两个循环中都用了var声明同一个变量,这样第二个for循环很可能就会受影响!
2、在每一次循环中let声明的变量都是不同的变量实例
2.1 var
看下面两段代码:
for(var i = 0; i < 5; i++){console.log('---');setTimeout(() => console.log(i),0);}
大家猜这段代码结果是多少,你是不是以为是 0 1 2 3 4,但其实是5 5 5 5 5。
这是为什么呢?首先搞懂setTimeout。
这其实就是之前说过的JS事件循环,具体请看我的文章:JavaScript-事件循环
以为setTimeout是宏任务,它会等到所有同步任务执行完后再执行。举个例子大家就懂了:
for(var i = 0; i < 5; i++){console.log('---');setTimeout(() => console.log(i),0);}for(var j = 0; j < 5; j++){console.log('000000');}
这两个for循环,输出结果是这样的:即所有同步代码执行完后再执行异步任务。
setTimeout(function,0)还有很多妙用,之后也会为大家带来这些小妙招。
说回来,最上面那个var的for循环执行过程就如下:
红宝石书上的解释:“在退出循环时,迭代变量保存的时导致循环退出的值:5。在之后执行超市逻辑时,所有的i都是同一个变量,因而输出的都是同一个最终值”
setTimeout的代码是最后执行,然而在执行同步代码时,第一次循环给了第一个setTimeout的i为0,第二次循环给了i值为1,因为大家用的都是同一个1,所以第二次循环修改为1后,第一次循环给的那个异步任务的i值也会变为1(因为此时还没开始执行异步任务,所以修改是有效的)。
2.2 let
把上面那段代码换成let:
for(let j = 0; j < 5; j++){console.log('---');setTimeout(() => console.log(j),0);}
这次输出就是0 1 2 3 4了:
为什么呢?
红宝石书上原话是:“在使用let声明迭代变量时,JavaScript引擎在后台为每个迭代循环声明一个新的迭代变量,每个setTimeout引用的都是不同的变量实例” 。
其实就是上面那幅图,每次给setTimeout的i值,前面都不会更新了,因为每次给的i值都是一个新的变量实例。
注意:这种每次循环中声明一个独立变量的行为适用于所有for循环,包括for-in和for-of。
----------------------------------------------------------------------------------------
今天刚开始写读书笔记,以后会坚持写的,将一些我没经常用到的知识点记录一下。这本书真的很好,可以说让我注意到了许多平时没注意的细节,比如虽然以前知道var没有块级作用域,但我用for循环时还是用的var声明循环变量,以后就记得了,一定要用let,这样代码更严谨一点。
关于let你不知道的知识点——红宝石书笔记记录相关推荐
- 《Effective C++》第8章 定制new和delete-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- 3.14 我总结的一些小红书笔记发布频率技巧!【玩赚小红书】
一.笔记审核机制 说到笔记曝光率自然离不开小红书的笔记审核机制.小红书整改之前的机制近乎于零,只要避免很多不合规的发布即可.但是,现在我们必须遵守和适应新的审核规则和机制,才有更多的笔记文章分享到达用 ...
- 小红书笔记如何发布内容
很多人都在吐糟自己不能发送小红书的笔记本,但很多人对于小红书笔记发不了是为什么,还是找不到原因,其实原因有很多种,小编也不一一给大家介绍了,今天小编给大家演示下正确的小红书笔记发布流程,下面小编就给大 ...
- 涂书笔记-让读书笔记不再困难
今天晴空万里,没有一丝云彩,阳光也暖暖的,照得人心头亮堂堂的.而我趁着五一这放假的时光,补充一下精神的食粮,倚靠在那略微倾斜的凳子上,阅读着我喜欢的书.看书看到宋真宗赵恒,想起他曾说"富家不 ...
- EssentialC++_chapter06 binary tree 的学习笔记记录及问题
Essential C++ chapter06 binary tree 的学习笔记记录及问题 Author:Dargon Note date:2021/02/28 Source: <Essent ...
- 干货分享:高效办公工具【视频转文字、视频播放器、B站视频下载软件、贴图、截图提取文字并翻译、笔记记录软件、任务管理网站】
高效办公工具分享--视频转文字.视频播放器.B站视频下载软件.贴图.截图提取文字并翻译.笔记记录软件.任务管理网站 一 前言 二.下载链接及效果 1.视频自动转文字-飞书妙记(目前免费使用!!) 2. ...
- Examination:《计算机系统与网络技术》计算机三级考试重点笔记记录
Examination:<计算机系统与网络技术>计算机三级考试重点笔记记录 目录 1.十进制转2进制 一.选择题 2.网友总结 二.综合题 三.应用题 1.根据IP地址.子网掩码地址,求出 ...
- 【方向盘】达到Linux第三阶段的常用命令笔记记录---Part Ⅱ
实现自己既定的目标,必须能耐得住寂寞单干 本文已被https://yourbatman.cn收录:女娲Knife-Initializr工程可公开访问啦:程序员专用网盘https://wangpan.y ...
- 小红书笔记打开显示连接不到服务器,小红书笔记看不到全文怎么回事啊?怎么发布小红书笔记?...
我们可以通过小红书购物笔记了解一些商品哦,因为小红书购物笔记里面的内容基本都是一些买家的购物体验,对于要买东西的我们来说,可以提供一些建议.可是最近有网友咨询小红书笔记看不到全文,小红书购物笔记找不到 ...
最新文章
- bzoj 3028 生成函数
- hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)...
- c语言用fun求矩阵,C语言通过函数调用求n*n阶矩阵周边元素绝对值之和
- yolov3 python_Python 3 Keras YOLO v3解析与实现
- 橙白oj18训练作业2-题解、代码
- golang string转int8_golang 中string和int类型相互转换
- 【数据结构与算法】二叉堆V2.0的Java实现
- 社群空间站v3.5.2 后台增加一处备注
- ssm如何支持热部署_IntelliJ IDEA基于SpringBoot如何搭建SSM开发环境
- 插入排序算法(insertion-sort)
- Application Wizard生成的项目文件简介
- 几种物流仿真软件的比较
- 论文阅读《Revisiting Domain Generalized Stereo Matching Networks from a Feature Consistency Perspective》
- MongoDB windows 局域网连接
- LBS服务LevelUp推二维码支付产品
- matlab生成曲线程序,Matlab绘制频散曲线程序代码(20210119130722).docx
- ubuntu vi 方向键乱
- 不知道有哪些可以语音转文字的软件?推荐你用这个
- Android 手机自动化测试工具有哪几种?
- 解决ChatGPT网络总是掉线问题