您好,登錄后才能下訂單哦!
這篇“es6暫時性死區指的是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“es6暫時性死區指的是什么”文章吧。
在es6中,暫時性死區是一個語法錯誤,是指let和const命令使區塊形成封閉的作用域。在代碼塊內,使用let/const命令聲明變量之前,該變量都是不可用的,在變量聲明之前屬于該變量的“死區”;這在語法上,稱為“暫時性死區”。ES6規定暫時性死區和let、const語句不出現變量提升,主要是為了減少運行時錯誤,防止在變量聲明前就使用這個變量,從而導致意料之外的行為。
什么是暫時性死區
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的主要不同有兩個地方:
let/const是使用區塊作用域;var是使用函數作用域
在let/const聲明之前就訪問對應的變量與常量,會拋出ReferenceError錯誤;但在var聲明之前就訪問對應的變量,則會得到undefined
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暫時性死區指的是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。