es6暫時(shí)性死區(qū)指的是什么

這篇“es6暫時(shí)性死區(qū)指的是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“es6暫時(shí)性死區(qū)指的是什么”文章吧。

公司專注于為企業(yè)提供成都做網(wǎng)站、網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、商城網(wǎng)站開發(fā),成都小程序開發(fā),軟件按需網(wǎng)站制作等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會(huì)仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計(jì)、整合,為客戶設(shè)計(jì)出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,成都創(chuàng)新互聯(lián)更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。

在es6中,暫時(shí)性死區(qū)是一個(gè)語(yǔ)法錯(cuò)誤,是指let和const命令使區(qū)塊形成封閉的作用域。在代碼塊內(nèi),使用let/const命令聲明變量之前,該變量都是不可用的,在變量聲明之前屬于該變量的“死區(qū)”;這在語(yǔ)法上,稱為“暫時(shí)性死區(qū)”。ES6規(guī)定暫時(shí)性死區(qū)和let、const語(yǔ)句不出現(xiàn)變量提升,主要是為了減少運(yùn)行時(shí)錯(cuò)誤,防止在變量聲明前就使用這個(gè)變量,從而導(dǎo)致意料之外的行為。

什么是暫時(shí)性死區(qū)

ES6中,在代碼塊內(nèi),使用let/const命令聲明變量之前,該變量都是不可用的,在變量聲明之前屬于該變量的“死區(qū)”。這在語(yǔ)法上,稱為“暫時(shí)性死區(qū)”(temporal dead zone,簡(jiǎn)稱 TDZ)。ES標(biāo)準(zhǔn)并沒(méi)有明確提出TDZ,但我們常用其描述let、const的不提升效果。

let/const和var的區(qū)別

在ES6之前,JS的scope只有兩種,全局作用域和函數(shù)作用域,但是在ES6種出現(xiàn)了塊級(jí)作用域,即使用let/const可以定義塊級(jí)作用域。 那么在ES6的新特性中,最容易看到TDZ作用的就是使用let/const的使用上面。 let/const與var的主要不同有兩個(gè)地方:

  • let/const是使用區(qū)塊作用域;var是使用函數(shù)作用域

  • 在let/const聲明之前就訪問(wèn)對(duì)應(yīng)的變量與常量,會(huì)拋出ReferenceError錯(cuò)誤;但在var聲明之前就訪問(wèn)對(duì)應(yīng)的變量,則會(huì)得到undefined

console.log(Vname); // undefined;
console.log(Lname); // ReferenceError
var Vname = 'xiaoxiao';
let Lname = 'xiaoxiao';

實(shí)踐證明當(dāng)我們?cè)谖绰暶髦笆褂胿ar定義的變量時(shí)會(huì)得到undefined,但是在使用let未定義的變量時(shí)會(huì)拋出錯(cuò)誤。因?yàn)镋S6中的let聲明的變量是不存在變量提升的作用。

var x = 10;
if (true) {
    x = 20; // ReferenceError
    let x;
 }

ES6 明確規(guī)定,如果區(qū)塊中存在let和const命令,這個(gè)區(qū)塊對(duì)這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會(huì)報(bào)錯(cuò)。 總之,在代碼塊內(nèi),使用let命令聲明變量之前,該變量都是不可用的。這在語(yǔ)法上,稱為“暫時(shí)性死區(qū)”(temporal dead zone,簡(jiǎn)稱 TDZ)。

if (true) {
  // TDZ開始
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError

  let tmp; // TDZ結(jié)束
  console.log(tmp); // undefined

  tmp = 123;
  console.log(tmp); // 123
}

上面代碼中,在let命令聲明變量tmp之前,都屬于變量tmp的“死區(qū)”。

typeof的“死區(qū)”陷阱

我們都知道使用typeof 可以用來(lái)檢測(cè)給定變量的數(shù)據(jù)類型,也可以使用它來(lái)判斷值是否被定義。當(dāng)返回undefined時(shí)表示值未定義; 但是在const/let定義的變量在變量聲明之前如果使用了typeof就會(huì)報(bào)錯(cuò)

typeof x; // ReferenceError
let x;

因?yàn)閤是使用let聲明的,那么在x未聲明之前都屬于暫時(shí)性死區(qū),在使用typeof時(shí)就會(huì)報(bào)錯(cuò)。所以在使用let/const進(jìn)行聲明的變量在使用typeof時(shí)不一定安全喔。

typeof y; // 'undefined'

但是可以看出,如果我們只是用了typeof而沒(méi)有去定義,也是不會(huì)報(bào)錯(cuò)的,從這??梢钥闯鲋灰獩](méi)有明確規(guī)定使用const/let定義之前就是不會(huì)出錯(cuò)。

傳參的“死區(qū)”陷阱

例如下面一段代碼,我們?cè)谑褂?/p>

function bar(x = y, y = 2) {
  return [x, y];
}

bar(); // 報(bào)錯(cuò)

上面代碼中,調(diào)用bar函數(shù)之所以報(bào)錯(cuò)(某些實(shí)現(xiàn)可能不報(bào)錯(cuò)),是因?yàn)閰?shù)x默認(rèn)值等于另一個(gè)參數(shù)y,而此時(shí)y還沒(méi)有聲明,屬于”死區(qū)“。如果y的默認(rèn)值是x,就不會(huì)報(bào)錯(cuò),因?yàn)榇藭r(shí)x已經(jīng)聲明了。

function bar(x = 2, y = x) {
  return [x, y];
}
bar(); // [2, 2]

使用var和let聲明的另外一種區(qū)別。

// 不報(bào)錯(cuò)
var x = x;

// 報(bào)錯(cuò)
let x = x;
// ReferenceError: x is not defined

受“死區(qū)”的影響,使用let聲明變量時(shí),只要變量在還沒(méi)有聲明完成前使用,就會(huì)報(bào)錯(cuò)。上面這行就屬于這個(gè)情況,在變量x的聲明語(yǔ)句還沒(méi)有執(zhí)行完成前,就去取x的值,導(dǎo)致報(bào)錯(cuò)”x 未定義“。

以上就是關(guān)于“es6暫時(shí)性死區(qū)指的是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

標(biāo)題名稱:es6暫時(shí)性死區(qū)指的是什么
網(wǎng)頁(yè)網(wǎng)址:http://muchs.cn/article20/phoijo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站策劃云服務(wù)器、App設(shè)計(jì)網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)