块级作用域
ES6(ECMAScript 2015)引入了块级作用域的概念,这是通过新增的 let 和 const 关键字实现的。在 ES6 之前,JavaScript 仅具有全局作用域和函数作用域,使用 var 声明的变量会在这两种作用域中生效,但不会受到代码块(如 if 语句或循环)的影响。
使用 let 声明变量
块级作用域:当使用
let在一个块(由一对花括号{}包围的一段代码)中声明一个变量时,该变量只在该块内有效。javascript{ let x = 2; } console.log(x); // 报错,x is not defined暂时性死区(Temporal Dead Zone, TDZ):从代码块开始到
let声明变量之间的区域被称为“暂时性死区”。在这一区域内,尝试访问该变量会导致错误。javascriptconsole.log(x); // ReferenceError: x is not defined let x = 3;
使用 const 声明常量
常量与块级作用域:
const用于声明常量,并且也遵循块级作用域规则。但不同于let,一旦声明并赋值后,const定义的常量不能被重新赋值。不过要注意的是,如果const变量是一个对象或者数组,其内容是可以修改的,只是引用本身不可改变。javascriptconst y = 5; y = 10; // TypeError: Assignment to constant variable.
对比 var
函数作用域 vs. 块级作用域:使用
var声明的变量不遵循块级作用域规则,而是遵循函数作用域(或全局作用域)。这意味着即使在块内部使用var声明变量,在块外部也可以访问它。javascriptif (true) { var z = 7; } console.log(z); // 输出 7
总之,ES6 中的 let 和 const 提供了更细粒度的作用域控制,使得代码更加安全、清晰和易于理解。它们帮助开发者避免了由于变量提升和其他 var 相关问题导致的错误。