摘要:但是值得注意的是,由和定義的變量還擁有一個會讓人恨容易犯錯的特性臨時死區(qū),下文以簡稱。但是擁有的不僅是變量,函數(shù)的參數(shù)也有,接下來就一一講解。
ES6的第一章便是講新增了let和const這兩個變量,可以用于定義塊級作用域的變量。相對于于var定義的變量,由let和const定義的變量作用域不會被提升。但是值得注意的是,由let和const定義的變量還擁有一個會讓人恨容易犯錯的特性:臨時死區(qū)(Temporal Dead Zone,下文以TDZ簡稱)。但是擁有TDZ的不僅是變量,函數(shù)的參數(shù)也有,接下來就一一講解。
一:變量的臨時死區(qū)
例1:在變量的作用域外引用變量
function testTdz() { console.log(colour); if(1 === 1){ let colour = "blue"; } } testTdz(); //undefined
例2:在變量的臨時死區(qū)內(nèi)引用變量
function testTdz() { if(1 === 1){ console.log(colour); let colour = "blue"; } } testTDZ(); // Uncaught ReferenceError: Cannot access "colour" before initialization
例3: 在變量作用域且初始化之后引用變量
function testTdz() { if(1 === 1){ let colour = "blue"; console.log(colour); } } testTdz();//"blue"
以上的三個例子,例2展示了在變量的臨時死區(qū)內(nèi)引用變量會導(dǎo)致拋出錯誤。再結(jié)合這三個例子我可以準(zhǔn)確地定義出變量的臨時死區(qū)的區(qū)域?yàn)椋?/p>
1: 在變量的作用域內(nèi) 2: 在變量的定義之前
如果以一張圖來表示的話,就是下圖所示,框起來的區(qū)域:
這里需要特別注意的是,我們在if表達(dá)式里面定義colour變量,那么它的作用域就只是在if表達(dá)式的大括號里面。在testTdz()方法內(nèi),if表達(dá)式大括號外的區(qū)域不是colour的作用域,那就一定不是它的臨時死區(qū),在這些地方引用colour變量,是不會造成拋錯的,只是變量的值是undefined,這也是上面的例1所展示的道理。
二:函數(shù)參數(shù)的臨時死區(qū)
我們在定義函數(shù)參數(shù)的時候,其實(shí)在背后,這些參數(shù)就如同用let定義的變量一樣,擁有自己的作用域。這些參數(shù)變量在初始化之前,如果被引用,也會拋出錯誤。當(dāng)我們調(diào)用函數(shù),會通過參數(shù)的傳值或者默認(rèn)值初始化這些參數(shù)。為了理解函數(shù)參數(shù)的臨時死區(qū)特性,我們先來看一個正確使用函數(shù)參數(shù)的例子:
例1:
function testFunctionTdz(first, second = first + 1) { console.log(`first: ${first} || second: ${second}`); } testFunctionTdz(1); //first: 1 || second: 2 testFunctionTdz(1, 1); //first: 1 || second: 1
當(dāng)我們執(zhí)行testFunctionTdz(1)的時候,實(shí)際上背后的執(zhí)行代碼是:
let first = 1; let second = first + 1; // 1 + 1
當(dāng)我們執(zhí)行testFunctionTdz(1, 1) 的時候,實(shí)際執(zhí)行的代碼是:
let first = 1; let second = 1;
所以上面的兩個調(diào)用都可以正常地調(diào)用下去。接下來我們稍微改造一下上面的代碼,看一個在參數(shù)的臨時死區(qū)引用變量,從而導(dǎo)致程序拋錯的例子:
function testFunctionTdz(first = second + 1, second) { console.log(`first: ${first} || second: ${second}`); } testFunctionTdz(1, 1); // first: 1 || second: 1 testFunctionTdz(undefined, 1); // Uncaught ReferenceError: Cannot access "second" before initialization
在這個例子,當(dāng)我們執(zhí)行testFunctionTdz(undefined, 1)時,背后的代碼實(shí)際上是:
let first = second; //在這個區(qū)域,就是變量second的臨時死區(qū),所以會導(dǎo)致程序拋錯 let second = 1;
以上就是變量和函數(shù)參數(shù)的臨時死區(qū)的內(nèi)容,自認(rèn)為應(yīng)該是講得十分清楚了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105874.html
摘要:聲明之函數(shù)作用域和全局作用域。塊級作用域不能重復(fù)聲明臨時性死區(qū)等特性用來解決變量存在的種種問題。塊級作用域終于在外面訪問不到了。一些常量聲明使用聲明的變量名全部大寫。 ES5之前javascript語言只有函數(shù)作用域和全局作用域,使用var來聲明變量,var聲明的變量還存在變量提升使人困惑不已。我們先來復(fù)習(xí)一下ES5的var聲明,再對比學(xué)習(xí)let和const 。 var var聲明之函...
摘要:錯誤的寫法錯誤的寫法中的構(gòu)造函數(shù)新增了支持默認(rèn)參數(shù)和不定參數(shù)。箭頭函數(shù)的簡單理解箭頭函數(shù)的左邊表示輸入的參數(shù),右邊表示輸出的結(jié)果。但是有了尾調(diào)用優(yōu)化之后,遞歸函數(shù)的性能有了提升。 作為前端切圖仔,越發(fā)覺得自己離不開函數(shù)了。 說到JavaScript函數(shù),腦子里都是匿名函數(shù)、普通函數(shù)、閉包函數(shù)、構(gòu)造函數(shù)......然后還能說出一大堆函數(shù)的概念。如果你達(dá)到這個水平,那么函數(shù)對你來說沒有難度...
摘要:形參默認(rèn)值不再影響對象當(dāng)使用默認(rèn)參數(shù)值時,對象的行為與以往有所不同。具有方法的函數(shù)被統(tǒng)稱為構(gòu)造函數(shù)。當(dāng)調(diào)用函數(shù)的方法時,被賦值為新創(chuàng)建對象實(shí)例如果調(diào)用方法,則的值為。 由于JavaScript開發(fā)者多年的不斷抱怨和呼吁,ES6終于大力度地更新了函數(shù)特性,在ES5基礎(chǔ)上進(jìn)行了許多改進(jìn)。 函數(shù)形參的默認(rèn)值 ES5形參默認(rèn)值的實(shí)現(xiàn) 在ES5中,你很可能通過以下這種方式為函數(shù)賦予默認(rèn)值: fu...
摘要:和都能夠聲明塊級作用域,用法和是類似的,的特點(diǎn)是不會變量提升,而是被鎖在當(dāng)前塊中。聲明常量,一旦聲明,不可更改,而且常量必須初始化賦值。臨時死區(qū)臨時死區(qū)的意思是在當(dāng)前作用域的塊內(nèi),在聲明變量前的區(qū)域叫做臨時死區(qū)。 主要知識點(diǎn)有:var變量提升、let聲明、const聲明、let和const的比較、塊級綁定的應(yīng)用場景showImg(https://segmentfault.com/img...
閱讀 3306·2021-11-24 09:39
閱讀 2823·2021-10-12 10:20
閱讀 1922·2019-08-30 15:53
閱讀 3086·2019-08-30 14:14
閱讀 2615·2019-08-29 15:36
閱讀 1131·2019-08-29 14:11
閱讀 1963·2019-08-26 13:51
閱讀 3420·2019-08-26 13:23