亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁(yè) web前端 前端問(wèn)答 es6暫時(shí)性死區(qū)是什麼意思

es6暫時(shí)性死區(qū)是什麼意思

Jan 03, 2023 pm 03:56 PM
es6 暫時(shí)性死區(qū)

在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)致意料之外的行為。

es6暫時(shí)性死區(qū)是什麼意思

本教學(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)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

ES6怎麼求數(shù)組反轉(zhuǎn) ES6怎麼求數(shù)組反轉(zhuǎn) Oct 26, 2022 pm 06:19 PM

在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是es6還是es7的 async是es6還是es7的 Jan 29, 2023 pm 05:36 PM

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轉(zhuǎn)es5 小程式為什麼要將es6轉(zhuǎn)es5 Nov 21, 2022 pm 06:15 PM

為了瀏覽器相容。 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)即可。

es6怎麼找出2個(gè)數(shù)組中不同項(xiàng) es6怎麼找出2個(gè)數(shù)組中不同項(xiàng) Nov 01, 2022 pm 06:07 PM

步驟: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和es6怎麼實(shí)現(xiàn)陣列去重 es5和es6怎麼實(shí)現(xiàn)陣列去重 Jan 16, 2023 pm 05:09 PM

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ū)是什麼意思 es6暫時(shí)性死區(qū)是什麼意思 Jan 03, 2023 pm 03:56 PM

在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是es6語(yǔ)法嗎 require是es6語(yǔ)法嗎 Oct 21, 2022 pm 04:09 PM

不是,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怎麼判斷陣列裡總共有多少項(xiàng) es6怎麼判斷陣列裡總共有多少項(xiàng) Jan 18, 2023 pm 07:22 PM

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

See all articles