理解 let 和 const 的作用域与生命周期

阅读时长 4 分钟读完

在 JavaScript 中,我们经常用 var 声明变量。然而,var 存在一些难以理解的作用域和生命周期问题,这可能会导致意外的错误和不一致的行为。所以,在 ECMAScript 2015 (ES6) 中引入了两个新的关键字 letconst,它们可以更好地处理作用域和生命周期问题。

let 和 const 的作用域

首先,让我们了解两者的作用域。在 ES6 中,letconst 都是块级作用域。这意味着,当你在一个块里(例如 {})使用 letconst 声明一个变量时,该变量只在该块及其内部作用域中可见,而不是在函数作用域或全局作用域中可见。

举个例子:

-- -------------------- ---- -------
-- ------ -
  --- - - --
  --- - - --
  ----- - - --
-

--------------- -- -
--------------- -- --------------- - -- --- -------
--------------- -- --------------- - -- --- -------

在上面的例子中,只有 var a 在整个函数作用域中都可见,let bconst c 只在 if 块中可见。

注意,letconst 的作用域是 暂时性死区(Temporal Dead Zone, TDZ),即它们在块中声明之前是不可访问的。比如:

在上面的例子中,访问 var a 的值,因为 var 变量有函数作用域,所以它的值为 undefined,而访问 let b 则会抛出 ReferenceError,因为 let 变量的值在声明之前不可访问。

此外,letconst 可以在同一个块作用域中声明多次,但变量名必须不同。

let 和 const 的生命周期

了解了作用域,我们再来看看生命周期。letconst 都是块级作用域,所以它们遵循与其他块级变量相同的规则。当块执行完成时,块级变量就被清除了。

举个例子:

在上面的例子中,变量 b 在块中声明并赋值,块执行完毕后,它被清除,所以在外面的代码中 b 不能访问。

但是,const 有一个特殊的行为。它声明的变量必须被初始化(即赋值)并且不能再被重新赋值。这意味着,const 对象可以保持在内存中,直到程序结束,而不能被重新赋值,但是对象的属性可以修改。

举个例子:

在上面的例子中,我们声明了 const 变量 person,并分配了一个对象。快照在内存中,无法重新分配变量。但是,我们仍然可以通过修改对象的属性来更改对象的内容。

总结

  • letconst 都是块级作用域,只在块中及其内部作用域中有效。
  • letconst 的作用域是暂时性死区,在声明之前对它们的访问是不允许的。
  • const 声明的变量必须被初始化,并且不能重新分配整个变量,但允许修改对象的属性。
  • 块级作用域允许更好的封装和代码复用,并且有助于减少可能的错误和副作用。

推荐阅读

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/644f5c022b2666adf3d8f175

纠错
反馈