【ES6】let与const

目录

let命令

作用域 

无变量提升 

不允许重复声明

 暂时性死区

块级作用域 

函数能否在块级作用域中声明 

 const命令


let命令

作用域 

ES6 新增了let命令,用来声明变量。它的用法类似于var,但是作用域不同,let命令只在所在的代码块内有效。举个例子:

{let a = 10var b = 1
}
console.log(a)//ReferenceError: a is not defined.
console.log(b)//1

上面代码在代码块之中,分别用letvar声明了两个变量a和b。在代码块之外调用这两个变量,结果变量a报错,变量b返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。

所以for循环就很适合用let,而且for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。例:

for (let i = 0; i < 3; i++) {let i = 'abc';console.log(i);
}
// abc
// abc
// abc

上面代码正确运行,并且输出了 3 次abc。这表明函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域(同一个作用域不可使用 let 重复声明同一个变量)。

无变量提升 

var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined

而let所声明的变量一定要在声明后使用,否则报错。 例:

console.log(foo); // 输出undefined
var foo = 2;console.log(bar); // 报错ReferenceError
let bar = 2;

不允许重复声明

简而言之就是不允许在相同作用域内,重复声明同一个变量。这个很好理解。例:

// 报错
function func() {let a = 10;var a = 1;
}// 报错
function func() {let a = 10;let a = 1;
}

 暂时性死区

ES6 明确规定,如果区块中存在letconst命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。也就是说,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。例:

if (true) {// TDZ开始tmp = 'bb'; // ReferenceErrorconsole.log(tmp); // ReferenceErrorlet tmp; // TDZ结束console.log(tmp); // undefinedtmp = aa;console.log(tmp); // aa
}

 上面代码中,在let命令声明变量tmp之前,都属于变量tmp的“死区”。

块级作用域 

let为 JavaScript 新增了块级作用域,且ES6允许块级作用域的任意嵌套。 

{{let a = 'b'{let a = 'a'console.log(a) // a}console.log(a) // b} console.log(a) // 报错
}

上面代码有3层块级作用域,每一层都是一个单独的作用域,因此外面的作用域无法读取内部作用域的变量。但是内部作用域可以定义外部作用域变量。

函数能否在块级作用域中声明 

ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。但是,浏览器没有遵守这个规定,为了兼容以前的旧代码,还是支持在块级作用域之中声明函数,不会报错。

ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。

 const命令

const命令有以下几个特点: 

const声明一个只读的常量。一旦声明,常量的值就不能改变。

const一旦声明变量,就必须立即初始化,不能留到以后赋值。 

const的作用域与let命令相同:只在声明所在的块级作用域内有效。(参考上面let命令)

const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。 (参考上面let命令)

const声明的常量,也与let一样不可重复声明。 (参考上面let命令)

注:const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。 

关于const命令就不举例说明了,建议自行尝试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/745594.shtml

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

相关文章

C# 根据两点名称,寻找两短路程的最优解,【有数据库设计,完整代码】

前言 如果我们遇到路径问题&#xff0c;可以使用点点连线&#xff0c;给定一个点&#xff0c;可以到达另外几个点&#xff0c;寻找最优解 例&#xff1a;如下图所示&#xff0c;如果要从A1-C1,可以有三条路 1.A1-B1-C1 2.A1-B2-C1 3.A1-B3-C1 最优解肯定是A1-B1-C1&#xff0c…

Java代码审计安全篇-XXE(XML外部实体注入)漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望各…

软考77-上午题-【面向对象技术3-设计模式】-创建型设计模式02

一、生成器模式 1-1、意图 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 1-2、结构图 Builder 为创建一个 Product 对象的各个部件指定抽象接口。ConcreteBuilder 实现 Builder 的接口以构造和装配该产品的各个部件&#xff0c;定…

3.14word直播知识点

word图表&#xff1a; 找到数据源→插入→图表→组合→带数据标签的折线图&#xff08;次要坐标轴&#xff09;→设计选项卡→切换行列&#xff08;excel不能关&#xff09;→&#xff08;单击右键&#xff0c;设置数据系列格式&#xff09;设置最大最小值→刻度单位→标签为无…

docker部署mysql5

1. 进入面板 2. 新建挂载文件夹 新建三个文件夹: mkdir -p /docker/mysql5/config && mkdir -p /docker/mysql5/data && mkdir -p /docker/mysql5/logsconfig&#xff1a;存放mysql配置data&#xff1a;存放mysql数据logs&#xff1a;存放mysql记录日志 3.…

css设置选中文字和选中图片字的颜色

要改变页面中选中文字的颜色&#xff0c;可以使用 CSS 的 ::selection 伪元素来实现 *::selection {/* 改变选中文字的背景色 */background-color: #c42121;/* 改变选中文字的文本颜色 */color: #fff; } 用通配符选择器给所有元素都加上了 ::selection伪元素&#xff0c;用于…

GPT实战系列-如何让LangChain的Agent选择工具

GPT实战系列-如何让LangChain的Agent选择工具 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法…

这个不需要吗 HttpServletRequest req

这个不需要吗 HttpServletRequest req 在这个特定场景下&#xff0c;您在OnlineStudentFeignService接口中确实不需要直接使用HttpServletRequest对象。因为Feign是一个声明式的HTTP客户端&#xff0c;它的设计目标是简化服务间的远程调用&#xff0c;它并不直接处理原始的HTT…

先验分布、后验分布、极大似然的一点思考

今天和组里同事聊天的时候&#xff0c;无意中提到了贝叶斯统计里先验分布、后验分布、以及极大似然估计这三个概念。同事专门研究如何利用条件概率做系统辨识的&#xff0c;给我画了一幅图印象非常深刻&#xff1a; 其中k表示时序关系。上面这个图表示后验分布是由先验分布与似…

SparkSQL读取本地文件写入MySQL

unit1&#xff1a;LoggerLevel 思路在main代码中&#xff0c;读取的文件要注意格式。 package com.unitsimport org.apache.log4j.{Level, Logger}trait LoggerLevel {Logger.getLogger("org").setLevel(Level.ERROR) }unit2&#xff1a;getLocalSparkSession pac…

2024年云服务器ECS价格表出炉——阿里云

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

深入理解TCP的四次分手过程

文章目录 深入理解TCP的四次分手过程四次分手的意义四次分手的工作原理四次分手的重要性实际应用中的考虑结论补充:TIME_WAIT在哪一步?TIME_WAIT状态的目的TIME_WAIT状态的影响 深入理解TCP的四次分手过程 在网络通信中&#xff0c;TCP&#xff08;传输控制协议&#xff09;确…

在Linux/Ubuntu/Debian中使用7z压缩和解压文件

要在 Ubuntu 上使用 7-Zip 创建 7z 存档文件&#xff0c;你可以使用“7z”命令行工具。 操作方法如下&#xff1a; 安装 p7zip&#xff1a; 如果你尚未在 Ubuntu 系统上安装 p7zip&#xff08;7-Zip 的命令行版本&#xff09;&#xff0c;你可以使用以下命令安装它&#xff1a;…

Gitlab光速发起Merge Request

前言 在我们日常开发过程中需要经常使用到Merge Request&#xff0c;在使用过程中我们需要来回在开发工具和UI界面之前来回切换&#xff0c;十分麻烦。那有没有一种办法可以时间直接开发开工具中直接发起Merge Request呢&#xff1f; 答案是有的。 使用 Git 命令方式创建 Me…

第八节:Vben Admin登录界面自定义和注销

系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 第六节:Vben Admin权限-后端控制方式 第七节…

k8s学习笔记

k8s学习笔记 定义1、pod2、Deployment3、Label4、Service5、Namespace kubectl工具 笔记大部分从官方地址中总结的&#xff0c;可以参考官方地址学习。 k8s官方文档地址&#xff1a;https://kubernetes.io/zh-cn/docs/ 定义 k8s中&#xff0c;所有内容都被抽象成资源&#xff…

Unity资源热更新----AssetBundle

13.1 资源热更新——AssetBundle1-1_哔哩哔哩_bilibili Resources 性能消耗较大 Resources文件夹大小不能超过2个G 获取AssetBundle中的资源 打包流程 选择图片后点击 创建文件夹&#xff0c;Editor优先编译 打包文件夹位置 using UnityEditor; using UnityEngine; public cla…

ideaSSM社区二手交易平台C2C模式开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea ssm 社区二手交易平台系统是一套完善的完整信息管理系统&#xff0c;结合SSM框架完成本系统SpringMVC spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码…

CCCorelib 点云八叉树下采样(CloudCompare内置算法库)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 octree采样方法与体素滤波器与很多相似之处,他们唯一的区别就是体素滤波器使用的是体元中的原始点集的质心作为采样点,而octree方法则是把距离体元中心最近的那个点作为采样点。这样的做法使得octree采样所获取的…

django-comment-migrate 模型注释的使用

django-comment-migrate 的使用 django-comment-migrate 是一个 Django 应用&#xff0c;用于将模型注释自动迁移到数据库表注释中。它可以帮助您保持数据库表注释与模型定义的一致性&#xff0c;并提高代码的可读性。 安装 要使用 django-comment-migrate&#xff0c;您需要…