1、let中沒有變量提升。
在通過babel-node執行es6的代碼時,是將es6轉換爲es5後去執行的,所以下面的代碼
<span style="font-size:18px;">if (true) {
// TDZ開始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ結束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}<br> 轉換爲es5後的代碼爲</span>
<span style="font-size:18px;">if (true) {
_tmp = 'abc'; //
console.log(_tmp); // abc
var _tmp = undefined;
console.log(_tmp); // undefined
_tmp = 123;
console.log(_tmp); // 123</span>
並且輸出的是undefined,而不是ReferenceError,但是在這裏就不要認爲let存在變量聲明,babel-node在執行的過程中會將代碼轉爲es5,
但是在正式的es6環境下會輸出ReferenceError, 和var聲明的變量不一樣,var 是當一個變量所在的函數被解析的時候,就爲函數創建了一個
函數作用域,變量也被初始化爲undefined,然後當函數執行到該變量聲明的地方的時候,就會對該對象進行初始化,如果沒有賦值,那麼該變量
的值就是undefined。而let聲明的變量存在TDZ(The temporal dead zone) 什麼意思呢?當let所在的包含塊被解析時,會創建一個塊級作用
域,但是此時變量是沒有初始化,在該塊級作用域中嘗試在let聲明之前獲取它的值或者給它賦值都將會報ReferenceError的錯誤。當執行到let
聲明的變量的時候會對該變量進行初始化,如果沒有賦值,那麼該變量的值是undefined。在這裏要感謝WhatTheFsck的指點。