ES6之let聲明

  • let 的「創建」過程被提升了,但是初始化沒有提升,不允許重復聲明。
  • var 的「創建」和「初始化」都被提升了。
  • TDZ 暫時死區,就是不能在初始化之前,使用變量。
let x = 'global'
{
  console.log(x) // Uncaught ReferenceError: x is not defined
  let x = 1
}

console.log(x)報錯了,說x沒有被定義,說明x指向的是let x = 1聲明的x,而不是塊代碼外的x變量
這就說明了let x = 1聲明提升了,你覺得代碼應該是這樣的:

let x = 'global'
{
  let x
  console.log(x) // Uncaught ReferenceError: x is not defined
  x = 1
}

因為let x不像var x一樣,聲明提升隨便初始化為undefined,這樣理解沒毛病,可以接受。但是看到下面這個例子后,我就懵了。

var tmp = 123;
if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

按我們上面的理解,代碼執行應該是這樣的:

var tmp = 123;
if (true) {
  let tmp;
  tmp = 'abc'; // ReferenceError
}

那么為什么會報錯呢,其實是我們理解錯了。
let tmp聲明確實被提升了,但同時變量tmp也進入了暫時性死區,直到真的執行到let tmp時,變量tmp才被初始化為undefined,這時候我們才可以使用變量tmp

下面這段代碼就很好理解TDZ 暫時死區

if (true) {
  // TDZ開始
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError

  let tmp; // TDZ結束
  console.log(tmp); // undefined

  tmp = 123;
  console.log(tmp); // 123
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容