es6中关于let的使用以及案例,包括但不限于块级作用域,不允许重复声明,没有变量提升,暂存性死区,不与顶层对象挂钩

news2025/1/31 18:42:01

ES6 let 关键字完整指南

1. 块级作用域

1.1 let vs var 作用域对比

// var - 函数作用域
function varExample() {
  var x = 1;
  if (true) {
    var x = 2;  // 同一个 x
    console.log(x);  // 2
  }
  console.log(x);  // 2
}

// let - 块级作用域
function letExample() {
  let x = 1;
  if (true) {
    let x = 2;  // 不同的 x
    console.log(x);  // 2
  }
  console.log(x);  // 1
}

1.2 循环中的块级作用域

// var 在循环中的问题
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1);  // 3, 3, 3
}

// let 在循环中的正确行为
for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1);  // 0, 1, 2
}

2. 不允许重复声明

2.1 同一作用域重复声明

// var 允许重复声明
var x = 1;
var x = 2;  // 正常工作

// let 不允许重复声明
let y = 1;
let y = 2;  // SyntaxError: Identifier 'y' has already been declared

// var 和 let 也不能重复声明
var z = 1;
let z = 2;  // SyntaxError: Identifier 'z' has already been declared

2.2 不同作用域的声明

// 不同块级作用域可以声明同名变量
let x = 1;
if (true) {
  let x = 2;  // 正常工作
  console.log(x);  // 2
}
console.log(x);  // 1

3. 没有变量提升

3.1 var 的变量提升

console.log(x);  // undefined
var x = 1;

// 等同于
var x;
console.log(x);
x = 1;

3.2 let 的非提升特性

console.log(x);  // ReferenceError: Cannot access 'x' before initialization
let x = 1;

// 函数中也是一样
function example() {
  console.log(x);  // ReferenceError
  let x = 1;
}

4. 暂时性死区(TDZ)

4.1 基本概念

// 在声明之前使用变量会导致 TDZ 错误
{
  console.log(x);  // ReferenceError
  let x = 1;
}

4.2 复杂场景中的 TDZ

// 函数参数中的 TDZ
function example(x = y, y = 2) {
  return [x, y];
}
example();  // ReferenceError: y is not defined

// 条件语句中的 TDZ
if (true) {
  console.log(x);  // ReferenceError
  let x = 1;
}

5. 不与顶层对象挂钩

5.1 var 与顶层对象的关系

// 浏览器环境
var x = 1;
console.log(window.x);  // 1

// Node.js 环境
var y = 1;
console.log(global.y);  // 1

5.2 let 与顶层对象的隔离

// 浏览器环境
let x = 1;
console.log(window.x);  // undefined

// Node.js 环境
let y = 1;
console.log(global.y);  // undefined

6. 实际应用场景

6.1 循环中的闭包

// 使用 var 的问题
const buttons = document.querySelectorAll('button');
for (var i = 0; i < buttons.length; i++) {
  buttons[i].addEventListener('click', function() {
    console.log('Button ' + i + ' clicked');  // 总是显示最后一个 i
  });
}

// 使用 let 的解决方案
for (let i = 0; i < buttons.length; i++) {
  buttons[i].addEventListener('click', function() {
    console.log('Button ' + i + ' clicked');  // 正确显示当前按钮的索引
  });
}

6.2 模块封装

// 使用 let 创建私有变量
{
  let privateData = 'secret';
  
  function doSomething() {
    console.log(privateData);
  }
  
  // 外部无法访问 privateData
  window.api = { doSomething };
}

7. 最佳实践

7.1 推荐用法

// ✅ 使用 let 声明可变变量
let count = 0;
count++;

// ✅ 在循环中使用 let
for (let i = 0; i < array.length; i++) {
  // ...
}

// ✅ 在块级作用域中使用 let
if (condition) {
  let temp = calculate();
  // ...
}

7.2 避免的模式

// ❌ 避免在声明前使用变量
function wrong() {
  console.log(x);  // 避免 TDZ 错误
  let x = 1;
}

// ❌ 避免重复声明
let x = 1;
let x = 2;  // 语法错误

// ❌ 避免与 var 混用
var y = 1;
let y = 2;  // 语法错误

8. 与 const 的对比

8.1 基本区别

// let 允许重新赋值
let x = 1;
x = 2;  // 正常工作

// const 不允许重新赋值
const y = 1;
y = 2;  // TypeError: Assignment to constant variable

8.2 对象属性

// let 和 const 都允许修改对象属性
let obj1 = { a: 1 };
obj1.a = 2;  // 正常工作

const obj2 = { a: 1 };
obj2.a = 2;  // 正常工作
obj2 = {};   // TypeError: Assignment to constant variable

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

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

相关文章

Mybatis初步了解

mysql缓存&#xff1a;根据sql语句进入缓存&#xff0c;如果sql语句多加一个空格就进入不到同一个缓存&#xff0c;另外数据库数据发生了更新&#xff0c;缓存中的数据不会同步。 延迟加载&#xff1a;先查询基本信息&#xff0c;再查询其他信息&#xff0c;而不是一次就查询出…

短连接项目01---基本框架的搭建和测试运行

文章目录 1.什么是短链2.仓库的创建3.项目的创建4.配置文件的修改5.三个模块的创建5.1如何创建5.2类型的选择5.3包的完善 6.yml文件的配置7.启动类的测试8可能会出现的问题 1.什么是短链 下面的这个就是一个长的url&#xff0c;我们的短链里面的链就是链接&#xff0c;也就是我…

2023年吉林省职业院校技能大赛网络系统管理样题-网络配置(华三代码)

目录 附录1:拓扑图 附录2:地址规划表 1.S1 2.S3 3.S4 4.S5 5.S7 6.S8 7.S9 8.R1 9.R2 10.R3 11.EG1 12.EG2 13.AC1 14.AC2 附录1:拓扑图 编号 型号

WSL 安装cuDNN

WSL 安装cuDNN 参考文档&#xff1a;https://docs.nvidia.com/deeplearning/cudnn/installation/latest/linux.html#verifying-the-install-on-linux 1. 下载相应包 根据下方下载地址进入下载界面&#xff0c;并选择与自己电脑相对应的平台执行图中的命令 下载地址&#xff1…

stack 和 queue容器的介绍和使用

1.stack的介绍 1.1stack容器的介绍 stack容器的基本特征和功能我们在数据结构篇就已经详细介绍了&#xff0c;还不了解的uu&#xff0c; 可以移步去看这篇博客哟&#xff1a; 数据结构-栈数据结构-队列 简单回顾一下&#xff0c;重要的概念其实就是后进先出&#xff0c;栈在…

Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴

目录 背景 解决gpedit.msc打不开 解决复制粘贴 剪贴板的问题 启用远程桌面剪贴板与驱动器 重启RDP剪贴板监视程序 以上都不行&#xff1f;可能是操作被Win11系统阻止 最后 背景 远程桌面无法复制粘贴&#xff0c;需要查看下主机策略组设置&#xff0c;结果按WinR输入…

(2023 RESS ) Federated multi-source domain adversarial adaptation framework

&#x1f4da; 研究背景与挑战 机械设备的故障诊断对于保障生产效率和安全至关重要。传统的智能诊断方法依赖于大量的训练数据&#xff0c;但在实际工业场景中&#xff0c;数据收集受到经济和时间因素的限制。更棘手的是&#xff0c;由于行业竞争和隐私安全问题&#xff0c;不…

Python数据分析-Python语法基础,IPython和Jupyter-Notebooks(二)

title: ‘Python数据分析:Python语法基础&#xff0c;IPython和Jupyter Notebooks&#xff08;二&#xff09;’ tags: python数据分析 categories:python数据分析 keywords:python数据分析 cover: …/img/404_icecream_whale.png description: 本文介绍python的基础语法和jup…

Redis学习之哨兵一

一、基本概念 1.主从复制的问题&#xff1a; 一旦主节点出现故障需要手动的将一个从节点晋升为主节点同时需要修改应用方的主节点地址还需要通过命令其他节点去复制新的主节点。 主节点的写能力和存储能力受到单机的限制 2.高可用&#xff1a; 上图为一主二从的redis主从复制模…

【C++高并发服务器WebServer】-9:多线程开发

本文目录 一、线程概述1.1 线程和进程的区别1.2 线程之间共享和非共享资源1.3 NPTL 二、线程操作2.1 pthread_create2.2 pthread_exit2.3 pthread_join2.4 pthread_detach2.5 patch_cancel2.6 pthread_attr 三、实战demo四、线程同步五、死锁六、读写锁七、生产消费者模型 一、…

【时时三省】(C语言基础)文件的随机读写

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 fseek 根据文件指针的位置和偏移量来定位文件指针 示例&#xff1a; 这个输出的就是ade seek&#xff3f;cur的意思是从当前偏移量 2就是从a往后偏移两个就是d 偏移量 SEEK&#xff3f;CUR…

【python】python基于机器学习与数据分析的二手手机特性关联与分类预测(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 python基于机器学习与数据分析的二手手机特性关联与…

WPF进阶 | WPF 数据绑定进阶:绑定模式、转换器与验证

WPF进阶 | WPF 数据绑定进阶&#xff1a;绑定模式、转换器与验证 一、前言二、WPF 数据绑定基础回顾2.1 数据绑定的基本概念2.2 数据绑定的基本语法 三、绑定模式3.1 单向绑定&#xff08;One - Way Binding&#xff09;3.2 双向绑定&#xff08;Two - Way Binding&#xff09;…

【数据结构】动态内存管理函数

动态内存管理 为什么存在动态内存管理动态内存函数的介绍&#x1f38a;malloc补充&#xff1a;perror函数&#x1f38a;free&#x1f38a;calloc&#x1f38a;realloc 常见动态内存错误对空指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一…

neo4j-community-5.26.0 install in window10

在住处电脑重新配置一下neo4j, 1.先至官方下载 Neo4j Desktop Download | Free Graph Database Download Neo4j Deployment Center - Graph Database & Analytics 2.配置java jdk jdk 21 官网下载 Java Downloads | Oracle 中国 path: 4.查看java -version 版本 5.n…

macbook安装go语言

通过brew来安装go语言 使用brew命令时&#xff0c;一般都会通过brew search看看有哪些版本 brew search go执行后&#xff0c;返回了一堆内容&#xff0c;最下方展示 If you meant "go" specifically: It was migrated from homebrew/cask to homebrew/core. Cas…

LCD液晶屏的工作原理以及背光模组

LCD液晶屏的工作原理以及背光模组 液晶屏工作原理 像素点的主要结构背光模组 LCD液晶屏主要由两部分组成&#xff0c;液晶屏和背光模组。背光模组提供均匀稳定的光源&#xff0c;液晶屏控制光线的传播路径&#xff0c;是屏幕显示设定的图像。 液晶屏 LCD的核心是两片玻璃之间…

maven的打包插件如何使用

默认的情况下&#xff0c;当直接执行maven项目的编译命令时&#xff0c;对于结果来说是不打第三方包的&#xff0c;只有一个单独的代码jar&#xff0c;想要打一个包含其他资源的完整包就需要用到maven编译插件&#xff0c;使用时分以下几种情况 第一种&#xff1a;当只是想单纯…

Controller 层优化四步曲

Controller 层优化四步曲 前言 在开发过程中&#xff0c;Controller 层作为系统与外界交互的桥梁&#xff0c;承担着接收请求、解析参数、调用业务逻辑、处理异常等职责。 然而&#xff0c;随着业务复杂度的增加&#xff0c;Controller 层的代码往往会变得臃肿且难以维护。 …

Java后端之AOP

AOP&#xff1a;面向切面编程&#xff0c;本质是面向特定方法编程 引入依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>示例&#xff1a;记录…