写点什么

let 关键字的特点

作者:bo
  • 2022 年 7 月 20 日
  • 本文字数:896 字

    阅读完需:约 3 分钟

前言🛴

let 语句声明一个块级作用域的本地变量,并且可选的将其初始化为一个值。

let 是 ES6 新增的用于声明变量的关键字,用自己的话说,它的出现主要是用来替代 var 关键字的,那使用 let 声明的变量有什么特点呢?🍗

特点🥂

  • let 声明的变量只在所处于的块级作用域有效

  • 不存在变量提升

  • 有暂时性死区

块级作用域🧐

块级作用域,就是使用了大括号后产生的作用域,我们来看下面这个代码

if (true) {    let a = 10;    console.log(a);     // 10}复制代码
复制代码

都在同一个大括号内,在同一块级作用域,可以正常打印;那如果打印和变量不在同一个大括号内,会正常打印吗?🍱

if (true) {    let a = 10;}console.log(a);复制代码
复制代码

这里将 console.log(a)放在了 if 语句外,而 a 是在 if 语句中定义的,不在同一作用域内,打印的结果为 a is not defined

注意: 使用let关键字声明的变量才有块级作用域,使用var声明的变量不具备块级作用域特性

好处🪐

防止循环变量变成全局变量

for (var i = 0; i < 3; i++) {}console.log(i);复制代码
复制代码

当我们在用 var 做循环时,循环变量 i 在结束循环后依然能访问;但当我们改成 let 后,结束循环后就访问不到了

for (let i = 0; i < 3; i++) {}console.log(i);     // i is not defined复制代码
复制代码

不存在变量提升🙌

在 ES6 之前,变量可以先使用再声明,存在变量提升。而使用let关键字就不会出现这种情况了,必须先是声明再使用,否则就会报错。

a = 10;console.log(a);     // 10var a;      复制代码
复制代码


a = 10;console.log(a);     // 报错let a;复制代码
复制代码

暂时性死区😮

先看下面的这串代码

var num = 10;if (true) {    console.log(num);   // 10}复制代码
复制代码

正常打印,结果是 10。

问题来了—— 那如果我在 if 语句中用 let 关键字再定义一个 num 后,还会正常打印吗?🤷‍♂️

var num = 10;if (true) {    console.log(num);    let num = 20;}   // Cannot access 'num' before initialization复制代码
复制代码

这就是 let 的暂时性死区。当作用域内存在用 let 关键字定义的同名变量时,console.log(num) 不会再到此块级作用域外去寻找变量,而作用域内的 num 是在其后面定义的,就会出现这种情况,无法正常运行。


发布于: 刚刚阅读数: 4
用户头像

bo

关注

还未添加个人签名 2022.07.11 加入

还未添加个人简介

评论

发布
暂无评论
let关键字的特点_前端_bo_InfoQ写作社区