es6暫時性死區是什麼意思

青灯夜游
發布: 2023-01-04 09:13:54
原創
2810 人瀏覽過

在es6中,暫時性死區是語法錯誤,是指let和const指令使區塊形成封閉的作用域。在程式碼區塊內,使用let/const指令宣告變數之前,變數都是不可用的,在變數宣告之前屬於該變數的「死區」;這在語法上,稱為「暫時性死區」。 ES6規定暫時性死區和let、const語句不出現變量提升,主要是為了減少運行時錯誤,防止在變量聲明前就使用這個變量,從而導致意料之外的行為。

es6暫時性死區是什麼意思

本教學操作環境: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的主要不同有兩個地方:

  • 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 規定暫時性死區和let、const語句不出現變數提升,主要是為了減少執行階段錯誤,​​防止在變數宣告前就使用這個變量,從而導致意料之外的行為。這樣的錯誤在 ES5 是很常見的,現在有了這種規定,避免這類錯誤就很容易了。

總之,暫時性死區的本質就是,只要一進入當前作用域,所要使用的變數就已經存在了,但是不可獲取,只有等到聲明變數的那一行程式碼出現,才可以取得和使用該變數。

註: TDZ最一開始是為了const所設計的,但後來的對let的設計也是一致的。

註: 在ES6標準中,對於const所宣告的識別子仍然也常為variable(變數),稱為constant variable(固定的變數)。以const宣告所創造出來的常數,在JS中只是不能再被賦(can't re-assignment),並不是不可被改變(immutable)的,這兩個概念仍然有很大的差異。

【相關推薦:javascript影片教學web前端

以上是es6暫時性死區是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板