在es6中,暫時(shí)性死區(qū)是語(yǔ)法錯(cuò)誤,是指let和const指令使區(qū)塊形成封閉的作用域。在程式碼區(qū)塊內(nèi),使用let/const指令宣告變數(shù)之前,變數(shù)都是不可用的,在變數(shù)宣告之前屬於該變數(shù)的「死區(qū)」;這在語(yǔ)法上,稱為「暫時(shí)性死區(qū)」。 ES6規(guī)定暫時(shí)性死區(qū)和let、const語(yǔ)句不出現(xiàn)變量提升,主要是為了減少運(yùn)行時(shí)錯(cuò)誤,防止在變量聲明前就使用這個(gè)變量,從而導(dǎo)致意料之外的行為。
本教學(xué)操作環(huán)境:windows7系統(tǒng)、ECMAScript 6版、Dell G3電腦。
什麼是暫時(shí)性死區(qū)?
#ES6中,在程式碼區(qū)塊內(nèi),使用let/const指令宣告變數(shù)之前,該變數(shù)都是不可用的,在變數(shù)宣告之前屬於該變數(shù)的「死區(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)了區(qū)塊級(jí)作用域,也就是使用let/const可以定義區(qū)塊級(jí)作用域。 那麼在ES6的新特性中,最容易看到TDZ作用的就是使用let/const的使用上方。 let/const與var的主要不同有兩個(gè)地方:
- let/const是使用區(qū)塊作用域;var是使用函數(shù)作用域
- 在let/const宣告之前就訪問(wèn)對(duì)應(yīng)的變數(shù)與常數(shù),會(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ù)時(shí)會(huì)得到undefined,但是在使用let未定義的變數(shù)時(shí)會(huì)拋出錯(cuò)誤。因?yàn)镋S6中的let宣告的變數(shù)是不存在變數(shù)提升的作用。
var x = 10; if (true) { x = 20; // ReferenceError let x; }
ES6 明確規(guī)定,如果區(qū)塊中存在let和const命令,這個(gè)區(qū)塊對(duì)這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會(huì)報(bào)錯(cuò)。 總之,在程式碼區(qū)塊內(nèi),使用let指令宣告變數(shù)之前,變數(shù)都是不可用的。這在語(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指令宣告變數(shù)tmp之前,都屬於變數(shù)tmp的「死區(qū)」。
typeof的「死區(qū)」陷阱
#我們都知道使用typeof 可以用來(lái)偵測(cè)給定變數(shù)的資料類型,也可以使用它來(lái)判斷值是否被定義。當(dāng)傳回undefined時(shí)表示值未定義; 但是在const/let定義的變數(shù)在變數(shù)宣告之前如果使用了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)行宣告的變數(shù)在使用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ò)
#上程式碼中,呼叫bar函數(shù)之所以報(bào)錯(cuò)(某些實(shí)作可能不報(bào)錯(cuò)),是因?yàn)閰?shù)x預(yù)設(shè)值等於另一個(gè)參數(shù)y,而此時(shí)y還沒(méi)有聲明,屬於」死區(qū)「。如果y的預(yù)設(shè)值是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宣告的另一個(gè)差異。
// 不報(bào)錯(cuò) var x = x; // 報(bào)錯(cuò) let x = x; // ReferenceError: x is not defined
受「死區(qū)」的影響,使用let宣告變數(shù)時(shí),只要變數(shù)在還沒(méi)有宣告完成前使用,就會(huì)報(bào)錯(cuò)。上面這行就屬於這個(gè)情況,在變數(shù)x的宣告語(yǔ)句還沒(méi)執(zhí)行完成前,就去取x的值,導(dǎo)致報(bào)錯(cuò)」x 未定義「。
總結(jié)
ES6 規(guī)定暫時(shí)性死區(qū)和let、const語(yǔ)句不出現(xiàn)變數(shù)提升,主要是為了減少執(zhí)行階段錯(cuò)誤,??防止在變數(shù)宣告前就使用這個(gè)變量,從而導(dǎo)致意料之外的行為。這樣的錯(cuò)誤在 ES5 是很常見的,現(xiàn)在有了這種規(guī)定,避免這類錯(cuò)誤就很容易了。
總之,暫時(shí)性死區(qū)的本質(zhì)就是,只要一進(jìn)入當(dāng)前作用域,所要使用的變數(shù)就已經(jīng)存在了,但是不可獲取,只有等到聲明變數(shù)的那一行程式碼出現(xiàn),才可以取得和使用該變數(shù)。
註: TDZ最一開始是為了const所設(shè)計(jì)的,但後來(lái)的對(duì)let的設(shè)計(jì)也是一致的。
註: 在ES6標(biāo)準(zhǔn)中,對(duì)於const所宣告的識(shí)別子仍然也常為variable(變數(shù)),稱為constant variable(固定的變數(shù))。以const宣告所創(chuàng)造出來(lái)的常數(shù),在JS中只是不能再被賦(can't re-assignment),並不是不可被改變(immutable)的,這兩個(gè)概念仍然有很大的差異。
【相關(guān)推薦:javascript影片教學(xué)、web前端】
以上是es6暫時(shí)性死區(qū)是什麼意思的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

在ES6中,可以利用數(shù)組物件的reverse()方法來(lái)實(shí)現(xiàn)數(shù)組反轉(zhuǎn),該方法用於顛倒數(shù)組中元素的順序,將最後一個(gè)元素放在第一位,而第一個(gè)元素放在最後,語(yǔ)法「array.reverse()」。 reverse()方法會(huì)修改原始數(shù)組,如果不想修改需要配合擴(kuò)充運(yùn)算子「...」使用,語(yǔ)法「[...array].reverse()」。

async是es7的。 async和await是ES7中新增內(nèi)容,是對(duì)於非同步操作的解決方案;async/await可以說(shuō)是co模組和生成器函數(shù)的語(yǔ)法糖,用更清晰的語(yǔ)意解決js非同步程式碼。 async顧名思義是「非同步」的意思,async用於聲明一個(gè)函數(shù)是異步的;async和await有一個(gè)嚴(yán)格規(guī)定,兩者都離不開對(duì)方,且await只能寫在async函數(shù)中。

為了瀏覽器相容。 ES6作為JS的新規(guī)範(fàn),加入了許多新的語(yǔ)法和API,但現(xiàn)代瀏覽器對(duì)ES6新特性支援不高,所以需將ES6程式碼轉(zhuǎn)換為ES5程式碼。在微信web開發(fā)者工具中,會(huì)預(yù)設(shè)使用babel將開發(fā)者ES6語(yǔ)法程式碼轉(zhuǎn)換為三端都能很好支援的ES5的程式碼,幫助開發(fā)者解決環(huán)境不同所帶來(lái)的開發(fā)問(wèn)題;只需要在專案中配置勾選好「ES6轉(zhuǎn)ES5」選項(xiàng)即可。

步驟:1、將兩個(gè)陣列分別轉(zhuǎn)換為set類型,語(yǔ)法「newA=new Set(a);newB=new Set(b);」;2、利用has()和filter()求差集,語(yǔ)法“ new Set([...newA].filter(x =>!newB.has(x)))”,差集元素會(huì)被包含在一個(gè)set集合中返回;3、利用Array.from將集合轉(zhuǎn)為數(shù)組類型,語(yǔ)法“Array.from(集合)”。

es5中可以利用for語(yǔ)句和indexOf()函數(shù)來(lái)實(shí)現(xiàn)數(shù)組去重,語(yǔ)法“for(i=0;i<數(shù)組長(zhǎng)度;i++){a=newArr.indexOf(arr[i]);if(a== -1){...}}」。在es6中可以利用擴(kuò)充運(yùn)算子、Array.from()和Set來(lái)去重;需要先將陣列轉(zhuǎn)為Set物件來(lái)去重,然後利用擴(kuò)充運(yùn)算子或Array.from()函數(shù)來(lái)將Set物件轉(zhuǎn)回?cái)?shù)組即可。

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

不是,require是CommonJS規(guī)範(fàn)的模組化語(yǔ)法;而es6規(guī)範(fàn)的模組化語(yǔ)法是import。 require是運(yùn)行時(shí)加載,import是編譯時(shí)加載;require可以寫在程式碼的任意位置,import只能寫在文件的最頂端且不可在條件語(yǔ)句或函數(shù)作用域中使用;require運(yùn)行時(shí)才引入模組的屬性所以效能相對(duì)較低,import編譯時(shí)引入模組的屬性所所以效能稍高。

在es6中,可以利用array物件的length屬性來(lái)判斷數(shù)組裡總共有多少項(xiàng),即取得數(shù)組中元素的個(gè)數(shù);該屬性可傳回?cái)?shù)組中元素的數(shù)組,只需要使用「array.length」語(yǔ)句即可傳回表示數(shù)組物件的元素個(gè)數(shù)的數(shù)值,也就是長(zhǎng)度值。
