ES6入门:let与const的详解及块级作用域

0 下载量 93 浏览量 更新于2024-08-28 收藏 75KB PDF 举报
"这篇ES6入门教程主要讲解了let和const的使用方法,重点在于它们引入的块级作用域和变量提升的新特性,以及暂时性死区的概念。" 在JavaScript的ES5版本中,变量的作用域主要是全局作用域和函数作用域,这导致了一些不理想的编程场景。例如,开发者可能会无意中覆盖全局变量,或者期望在特定代码块内定义的变量只在这个块内有效。为了解决这些问题,ES6引入了新的变量声明方式:let和const。 **let** 是一个用于声明块级作用域变量的关键字。与var不同,let声明的变量只在其所在的代码块内有效。例如: ```javascript { let a = 10; var b = 1; } a; // ReferenceError: a is not defined. b; // 1 ``` 在这个例子中,尝试在代码块外访问let声明的变量a会抛出错误,而var声明的变量b仍然可被访问。这表明let确保了变量的作用域限制在声明它的代码块内。 **变量提升(Hoisting)** var声明的变量会提升到其所在函数或全局作用域的顶部,允许在声明之前使用,但值为undefined。然而,let并没有这样的行为,它遵循“词法作用域”,必须在使用之前声明,否则会导致错误: ```javascript console.log(foo); // 输出undefined var foo = 2; console.log(bar); // 报错ReferenceError let bar = 2; ``` **暂时性死区(Temporal Dead Zone, TDZ)** 在块级作用域内,一旦遇到let或const声明,该区域就会形成一个暂时性死区。在声明变量的实际位置之前,尝试访问变量会抛出ReferenceError。这是因为变量在声明那一刻就已经存在,但不能立即访问: ```javascript var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; } ``` 总结一下,let的关键特性是块级作用域和避免变量提升。在代码块内,let声明的变量在声明之前处于暂时性死区,不能被访问。 **const** 用于声明常量,它的值一旦赋值后就不能改变。同样具有块级作用域,但需要注意的是,const声明的变量必须在声明时初始化,并且如果声明的是对象或数组,虽然引用不能变,但对象或数组的属性或元素是可以修改的: ```javascript const pi = 3.14; // 常量 pi = 3; // 报错,不能重新赋值 const person = { name: 'Alice' }; person.name = 'Bob'; // 可以修改对象的属性 ``` let和const为JavaScript提供更精细的控制变量的作用域和生命周期,使得代码更易于理解和维护。在编写ES6及以上版本的JavaScript代码时,推荐使用let和const来声明变量,以减少由于作用域问题引发的错误。