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

embedded/2025/2/4 2:50:41/

ES6 let 关键字完整指南

1. 块级作用域

1.1 let vs var 作用域对比

// var - 函数作用域
function varExample() {var x = 1;if (true) {var x = 2;  // 同一个 xconsole.log(x);  // 2}console.log(x);  // 2
}// let - 块级作用域
function letExample() {let x = 1;if (true) {let x = 2;  // 不同的 xconsole.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);  // ReferenceErrorlet x = 1;
}

4. 暂时性死区(TDZ)

4.1 基本概念

// 在声明之前使用变量会导致 TDZ 错误
{console.log(x);  // ReferenceErrorlet 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);  // ReferenceErrorlet 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);}// 外部无法访问 privateDatawindow.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.ppmy.cn/embedded/159350.html

相关文章

Dubbo view

1、 说说Dubbo核心的配置有哪些&#xff1f; 答&#xff1a; 配置 配置说明 dubbo:service 服务配置 dubbo:reference 引用配置 dubbo:protocol 协议配置 dubbo:application 应用配置 dubbo:module 模块配置 dubbo:registry 注册中心配置 dubbo:monitor 监控中心配置 dubbo:pr…

【数据结构与算法】九大排序算法实现详解

文章目录 Ⅰ. 排序的概念及其运用一、排序的概念二、常见的排序算法三、排序算法的接口四、测试算法接口附&#xff1a;Swap接口&#xff08;使用异或的方法实现&#xff09; Ⅱ. 排序算法的实现一、插入排序二、希尔排序( 缩小增量排序 )三、选择排序四、堆排序五、冒泡排序六…

C++中的析构器(Destructor)(也称为析构函数)

在C中&#xff0c;析构器&#xff08;Destructor&#xff09;也称为析构函数&#xff0c;它是一种特殊的成员函数&#xff0c;用于在对象销毁时进行资源清理工作。以下是关于C析构器的详细介绍&#xff1a; 析构函数的特点 名称与类名相同&#xff0c;但前面有一个波浪号 ~&a…

第二篇:多模态技术突破——DeepSeek如何重构AI的感知与认知边界

——从跨模态对齐到因果推理的工程化实践 在AI技术从单一模态向多模态跃迁的关键阶段&#xff0c;DeepSeek通过自研的多模态融合框架&#xff0c;在视觉-语言-语音的联合理解与生成领域实现系统性突破。本文将从技术实现层面&#xff0c;解构其跨模态表征学习、动态融合机制与…

计算机网络部分知识点(王道考研笔记)

计算机网络体系结构&#xff08;概念、框架&#xff09;&#xff08;选择填空题&#xff09; 什么是计算机网络&#xff1f; 计算机网络的概念&#xff1a;计算机网络是一个将众多分散的、自治的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软…

【LLM】DeepSeek-R1-Distill-Qwen-7B部署和open webui

note DeepSeek-R1-Distill-Qwen-7B 的测试效果很惊艳&#xff0c;CoT 过程可圈可点&#xff0c;25 年应该值得探索更多端侧的硬件机会。 文章目录 note一、下载 Ollama二、下载 Docker三、下载模型四、部署 open webui 一、下载 Ollama 访问 Ollama 的官方网站 https://ollam…

DeepSeek本地部署详细指南

DeepSeek本地部署详细指南 随着人工智能技术的飞速发展&#xff0c;本地部署大模型的需求也日益增加。DeepSeek作为一款开源且性能强大的大语言模型&#xff0c;提供了灵活的本地部署方案&#xff0c;让用户能够在本地环境中高效运行模型&#xff0c;同时保护数据隐私。以下是…

SuccessFactors OData OAuth with SAP IAS-generated SAML assertion

导读 IAS:一句话说明白。SAP相关的系统可以通过IAS登录&#xff0c;只要IAS登录&#xff0c;其他系统免密登录。 作者&#xff1a;vivi&#xff0c;来源&#xff1a;osinnovation 上图有三个角色&#xff1a;brower&#xff0c;就是自己的浏览器&#xff0c;sp就是我们的目标…