在 JavaScript 中,我们经常用 var
声明变量。然而,var
存在一些难以理解的作用域和生命周期问题,这可能会导致意外的错误和不一致的行为。所以,在 ECMAScript 2015 (ES6) 中引入了两个新的关键字 let
和 const
,它们可以更好地处理作用域和生命周期问题。
let 和 const 的作用域
首先,让我们了解两者的作用域。在 ES6 中,let
和 const
都是块级作用域。这意味着,当你在一个块里(例如 {}
)使用 let
或 const
声明一个变量时,该变量只在该块及其内部作用域中可见,而不是在函数作用域或全局作用域中可见。
举个例子:
-- -------------------- ---- ------- -- ------ - --- - - -- --- - - -- ----- - - -- - --------------- -- - --------------- -- --------------- - -- --- ------- --------------- -- --------------- - -- --- -------
在上面的例子中,只有 var a
在整个函数作用域中都可见,let b
和 const c
只在 if
块中可见。
注意,let
和 const
的作用域是 暂时性死区(Temporal Dead Zone, TDZ),即它们在块中声明之前是不可访问的。比如:
console.log(a); // undefined console.log(b); // ReferenceError: b is not defined var a = 1; let b = 2;
在上面的例子中,访问 var a
的值,因为 var
变量有函数作用域,所以它的值为 undefined
,而访问 let b
则会抛出 ReferenceError
,因为 let
变量的值在声明之前不可访问。
此外,let
和 const
可以在同一个块作用域中声明多次,但变量名必须不同。
let 和 const 的生命周期
了解了作用域,我们再来看看生命周期。let
和 const
都是块级作用域,所以它们遵循与其他块级变量相同的规则。当块执行完成时,块级变量就被清除了。
举个例子:
{ let b = 2; } console.log(b); // ReferenceError: b is not defined
在上面的例子中,变量 b
在块中声明并赋值,块执行完毕后,它被清除,所以在外面的代码中 b
不能访问。
但是,const
有一个特殊的行为。它声明的变量必须被初始化(即赋值)并且不能再被重新赋值。这意味着,const
对象可以保持在内存中,直到程序结束,而不能被重新赋值,但是对象的属性可以修改。
举个例子:
const person = { name: 'Alice', age: 27 }; person.age = 28; console.log(person); // { name: 'Alice', age: 28 }
在上面的例子中,我们声明了 const
变量 person
,并分配了一个对象。快照在内存中,无法重新分配变量。但是,我们仍然可以通过修改对象的属性来更改对象的内容。
总结
let
和const
都是块级作用域,只在块中及其内部作用域中有效。let
和const
的作用域是暂时性死区,在声明之前对它们的访问是不允许的。const
声明的变量必须被初始化,并且不能重新分配整个变量,但允许修改对象的属性。- 块级作用域允许更好的封装和代码复用,并且有助于减少可能的错误和副作用。
推荐阅读
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/644f5c022b2666adf3d8f175