只要塊級作用域內存在let命令,他所宣告的變數就繫結這個區域,不再受外部的影響。
var tmp = 123;
if (true) {
tmp = 'abc';
let tmp;
丟擲錯誤:referenceerror
上面**中,存在全域性變數tmp,但是塊級作用域內let又宣告了乙個區域性變數tmp,導致後者繫結這個塊級作用域,所以在let宣告變數前,對tmp賦值會報錯。
es6明確規定,如果區塊中存在let和const命令,這個區塊對這些命令宣告的變數,從一開始就形成了封閉作用域。但是宣告之前使用這些變數,就會報錯。
在上面的**中,let命令宣告變數tmp之前,都屬於變數tmp的死區。
暫時性死區的本質,只要一進入當前作用域,所使用的變數就已經存在了,但是不可獲取。只有等到宣告變數的那一行**出現,才可以獲取和使用該變數。
暫時性死區
let 關鍵字建立變數時,只將註冊提公升,初始化和賦值階段並未提公升,在初始化之前是不可被訪問的 稱為 暫時死區 temporal dead zone,簡稱 tdz 當嘗試訪問變數時,會丟擲 referenceerror 錯誤 console.log a 輸出 undefined var a 2 c...
JS的暫時性死區問題
1.基於let建立變數,會把大部分 當作乙個私有的塊級作用域 類似於函式的私有作用域 在這裡也是重新檢測語法規範,看一下是否是基於新語法建立的變數,如果是按照新語法規範來解析 2.console.log a uncaught referencerrror a is not defined conso...
ES6 中的 TDZ(暫時性死區)
temporal dead zone tdz 是 es6 es2015 中對作用域新的專用語義。在 es6 之前,js 的 scope 只有兩種,全域性作用域和函式作用域,在 es6 種出現了塊級作用域,即使用 let const 可以定義塊級作用域 let const 是使用區塊作用域 var 是...