中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

es6暫時性死區指的是什么

發布時間:2023-01-03 16:07:05 來源:億速云 閱讀:176 作者:iii 欄目:web開發

這篇“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暫時性死區指的是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

es6
AI

通渭县| 喀什市| 龙泉市| 色达县| 紫阳县| 乳源| 新兴县| 安陆市| 东阳市| 南和县| 鹤峰县| 东乌珠穆沁旗| 肃南| 岳普湖县| 翁源县| 海兴县| 铜鼓县| 丰顺县| 云南省| 肃南| 潢川县| 西昌市| 波密县| 若羌县| 平泉县| 高阳县| 巴林左旗| 五寨县| 阳泉市| 尼勒克县| 牟定县| 南川市| 上杭县| 海城市| 石棉县| 荆门市| 长乐市| 理塘县| 九江市| 彭州市| 邢台市|