在es6中,暫時性死區是語法錯誤,是指let和const指令使區塊形成封閉的作用域。在程式碼區塊內,使用let/const指令宣告變數之前,變數都是不可用的,在變數宣告之前屬於該變數的「死區」;這在語法上,稱為「暫時性死區」。 ES6規定暫時性死區和let、const語句不出現變量提升,主要是為了減少運行時錯誤,防止在變量聲明前就使用這個變量,從而導致意料之外的行為。
本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。
什麼是暫時性死區
#ES6中,在程式碼區塊內,使用let/const指令宣告變數之前,該變數都是不可用的,在變數宣告之前屬於該變數的「死區」。這在語法上,稱為「暫時性死區」(temporal dead zone,簡稱 TDZ)。 ES標準並沒有明確提出TDZ,但我們常用其描述let、const的不提升效果。
let/const和var的區別
#在ES6之前,JS的scope只有兩種,全域作用域和函數作用域,但是在ES6種出現了區塊級作用域,也就是使用let/const可以定義區塊級作用域。 那麼在ES6的新特性中,最容易看到TDZ作用的就是使用let/const的使用上方。 let/const與var的主要不同有兩個地方:
console.log(Vname); // undefined; console.log(Lname); // ReferenceError var Vname = 'xiaoxiao'; let Lname = 'xiaoxiao';
實踐證明當我們在未聲明之前使用var定義的變數時會得到undefined,但是在使用let未定義的變數時會拋出錯誤。因為ES6中的let宣告的變數是不存在變數提升的作用。
var x = 10; if (true) { x = 20; // ReferenceError let x; }
ES6 明確規定,如果區塊中存在let和const命令,這個區塊對這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會報錯。 總之,在程式碼區塊內,使用let指令宣告變數之前,變數都是不可用的。這在語法上,稱為「暫時性死區」(temporal dead zone,簡稱 TDZ)。
if (true) { // TDZ开始 tmp = 'abc'; // ReferenceError console.log(tmp); // ReferenceError let tmp; // TDZ结束 console.log(tmp); // undefined tmp = 123; console.log(tmp); // 123 }
上面程式碼中,在let指令宣告變數tmp之前,都屬於變數tmp的「死區」。
typeof的「死區」陷阱
#我們都知道使用typeof 可以用來偵測給定變數的資料類型,也可以使用它來判斷值是否被定義。當傳回undefined時表示值未定義; 但是在const/let定義的變數在變數宣告之前如果使用了typeof就會報錯
typeof x; // ReferenceError let x;
因為x是使用let宣告的,那麼在x未宣告之前都屬於暫時性死區,在使用typeof時就會報錯。所以在使用let/const進行宣告的變數在使用typeof時不一定安全喔。
typeof y; // 'undefined'
但是可以看出,如果我們只是用了typeof而沒有去定義,也是不會報錯的,從這粒可以看出只要沒有明確規定使用const/let定義之前就是不會出錯。
傳參的「死區」陷阱
#例如下面一段程式碼,我們在使用
function bar(x = y, y = 2) { return [x, y]; } bar(); // 报错
#上程式碼中,呼叫bar函數之所以報錯(某些實作可能不報錯),是因為參數x預設值等於另一個參數y,而此時y還沒有聲明,屬於」死區「。如果y的預設值是x,就不會報錯,因為此時x已經宣告了。
function bar(x = 2, y = x) { return [x, y]; } bar(); // [2, 2]
使用var和let宣告的另一個差異。
// 不报错 var x = x; // 报错 let x = x; // ReferenceError: x is not defined
受「死區」的影響,使用let宣告變數時,只要變數在還沒有宣告完成前使用,就會報錯。上面這行就屬於這個情況,在變數x的宣告語句還沒執行完成前,就去取x的值,導致報錯」x 未定義「。
總結
ES6 規定暫時性死區和let、const語句不出現變數提升,主要是為了減少執行階段錯誤,防止在變數宣告前就使用這個變量,從而導致意料之外的行為。這樣的錯誤在 ES5 是很常見的,現在有了這種規定,避免這類錯誤就很容易了。
總之,暫時性死區的本質就是,只要一進入當前作用域,所要使用的變數就已經存在了,但是不可獲取,只有等到聲明變數的那一行程式碼出現,才可以取得和使用該變數。
註: TDZ最一開始是為了const所設計的,但後來的對let的設計也是一致的。
註: 在ES6標準中,對於const所宣告的識別子仍然也常為variable(變數),稱為constant variable(固定的變數)。以const宣告所創造出來的常數,在JS中只是不能再被賦(can't re-assignment),並不是不可被改變(immutable)的,這兩個概念仍然有很大的差異。
【相關推薦:javascript影片教學、web前端】
以上是es6暫時性死區是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!