摘要:塊級(jí)作用域綁定變量聲明的變量聲明與其他的一些計(jì)算機(jī)語(yǔ)言不同,在類的語(yǔ)言中,變量總是在被聲明的地方創(chuàng)建而在中變量創(chuàng)建的位置取決于你如何聲明它,為我們提供了新的聲明方式用來(lái)讓開發(fā)者能夠更好的控制變量的作用域我們通過(guò)聲明的變量,無(wú)論其聲明位置在哪
塊級(jí)作用域綁定 1.變量聲明
JS的變量聲明與其他的一些計(jì)算機(jī)語(yǔ)言不同,在類C的語(yǔ)言中,變量總是在被聲明的地方創(chuàng)建;而在JS中變量創(chuàng)建的位置取決于你如何聲明它,ES6為我們提供了新的聲明方式用來(lái)讓開發(fā)者能夠更好的控制變量的作用域;
我們通過(guò)var聲明的變量,無(wú)論其聲明位置在哪里,都會(huì)編譯器視為聲明在所在函數(shù)的頂部,如果不在任何函數(shù)內(nèi),則默認(rèn)為全局作用域的頂部,這就是我們常說(shuō)的變量的提升。
但這種獨(dú)特方式有的時(shí)候會(huì)引發(fā)一些bug問(wèn)題,因?yàn)楫?dāng)變量提升的時(shí)候雖然已經(jīng)聲明但是并未賦值,所以值是undefined,如果新手不熟悉JS的這種行為,就會(huì)引發(fā)一些問(wèn)題,為了避免這種情況,ES6為我們提供了一種新的聲明方式叫做let;
1.1 let聲明所謂塊級(jí)聲明就是除去指定的塊的作用域外,任何地方都無(wú)法訪問(wèn)到你所聲明的變量,C語(yǔ)言以及很多類C語(yǔ)言都有這個(gè)機(jī)制。
那么關(guān)鍵問(wèn)題是如何創(chuàng)造一個(gè)塊級(jí)哦就是作用域呢?
在ES6中規(guī)定有在以下的情況下是可以創(chuàng)建塊級(jí)作用域的:
在函數(shù)內(nèi)部;
在一對(duì)代碼塊之間(也就是由一對(duì)花括號(hào)所包裹的)內(nèi)部;
ES6為了我們提供了新的聲明方式let,理論上來(lái)說(shuō),你可以用let來(lái)代替var來(lái)聲明變量,但是let所聲明的變量只作用域當(dāng)前塊級(jí)作用域內(nèi),這點(diǎn)要注意,另外一個(gè)重點(diǎn)就是let并不會(huì)將你所聲明的變量提升到頂部,所以在使用let聲明變量時(shí),需要注意將let聲明的變量手動(dòng)寫到當(dāng)前塊級(jí)作用域的頂部;
例如:
function letTEST(boo){ if(boo){ let value = true; } return value; }
參考以上代碼,當(dāng)傳參的值為true的時(shí)候會(huì)聲明一個(gè)變量value;但是由于let聲明的變量只會(huì)在當(dāng)前作用域內(nèi)才能被訪問(wèn),所以return value的時(shí)候會(huì)報(bào)錯(cuò),以上代碼應(yīng)當(dāng)更改為如下
function letTEST(boo){ if(boo){ let value = true; return value; }else{ return null } }
考慮另一個(gè)場(chǎng)景:
{ let a = 10; let a = 20; }
以上代碼在運(yùn)行時(shí)依然會(huì)報(bào)錯(cuò),所以我們可以得出一個(gè)結(jié)論就是在當(dāng)前塊級(jí)作用域內(nèi),let不能重復(fù)聲明變量,那么這是為何呢
這里就說(shuō)let聲明變量的機(jī)制問(wèn)題了,當(dāng)引擎執(zhí)行當(dāng)前代碼塊讀取到let的時(shí)候會(huì)將let所聲明的變量提升到一個(gè)封閉區(qū)間,我們稱之為TDZ(暫時(shí)性死區(qū)),這個(gè)區(qū)域內(nèi),不允許存在相同的變量名 所以重復(fù)使用let聲明瀏覽器會(huì)報(bào)錯(cuò);
1.2 const聲明在ES5以及之前的標(biāo)準(zhǔn)中,所有的變量都是可以被改變的,所以當(dāng)我們需要聲明一個(gè)常量的以后,需要避免聲明相同標(biāo)識(shí)符的變量以避免改變常量,但是也可能會(huì)不小心改變了這個(gè)變量,為了糾正這種不可靠的常量聲明方式,ES6引入了const來(lái)聲明常量;
const聲明變量的方式與let幾乎相同,唯一一點(diǎn)不同的地方在于const所聲明的變量是不可更改的,所以我們稱之為常量,看以下代碼:
const a = 10; a = 20;
以上代碼在瀏覽器中運(yùn)行的時(shí)候,引擎會(huì)報(bào)錯(cuò),所以我們可以得知const聲明的變量的值是不可更改的,正式由于這個(gè)原因,所以在我們利用const聲明變量的時(shí)候必須要賦值,如果在聲明的時(shí)候不賦值的話,引擎依然會(huì)拋出錯(cuò)誤;
通過(guò)以上測(cè)試我們可以的值const聲明變量不可更改,但是當(dāng)我們使用const聲明對(duì)象的時(shí)候,更改對(duì)象的值卻不會(huì)報(bào)錯(cuò),看以下代碼:
const a = { name = "lucy" } a.name = "blank" //運(yùn)行正常 a = { name = "leo" //報(bào)錯(cuò) }
那么我們通過(guò)以上代碼測(cè)試可知,const會(huì)阻止變量綁定以及變量本身的值得更改,并不會(huì)對(duì)其中的變量成員的更改做出合理的反應(yīng),這點(diǎn)很重要
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/84962.html
摘要:外層作用域不報(bào)錯(cuò)正常輸出塊級(jí)作用域與函數(shù)聲明規(guī)定,函數(shù)只能在頂層作用域和函數(shù)作用域之中聲明,不能在塊級(jí)作用域聲明。規(guī)定,塊級(jí)作用域之中,函數(shù)聲明語(yǔ)句的行為類似于,在塊級(jí)作用域之外不可引用。同時(shí),函數(shù)聲明還會(huì)提升到所在的塊級(jí)作用域的頭部。 前言:最近開始看阮一峰老師的《ECMAScript 6 入門》(以下簡(jiǎn)稱原...
摘要:對(duì)比常量聲明與聲明常量聲明與聲明,都是塊級(jí)聲明。最后一點(diǎn)全局塊級(jí)綁定與不同于的另一個(gè)方面是在全局作用域上的表現(xiàn)。塊級(jí)綁定新的最佳實(shí)踐在的發(fā)展階段,被廣泛認(rèn)可的變量聲明方式是默認(rèn)情況下應(yīng)當(dāng)使用而不是。總結(jié)與塊級(jí)綁定將詞法作用域引入。 var變量與變量提升 使用var關(guān)鍵字聲明的變量,無(wú)論其實(shí)際聲明位置在何處,都會(huì)被視為聲明于所在函數(shù)的頂部(如果聲明不在任意函數(shù)內(nèi),則被視為在全局作用域的頂...
摘要:聲明聲明的語(yǔ)法與的語(yǔ)法一致。總結(jié)文章都是以深入理解讀書筆記形式,大部分引用書中的定義,加上作者的理解,樣例也做了調(diào)整,所有樣例都可以放到里運(yùn)行親自嘗試。 1.變量提升 使用 var 關(guān)鍵字聲明的變量,無(wú)論其實(shí)際聲明位置在何處,都會(huì)被視為聲明于所在函數(shù)的 頂部(如果聲明不在任意函數(shù)內(nèi),則視為在全局作用域的頂部)。這句話從字面上不難理解。 但是他是怎樣一個(gè)過(guò)程,為什么會(huì)這樣。當(dāng)你代...
摘要:塊級(jí)作用域存在于兩個(gè)地方函數(shù)內(nèi)部。如下例應(yīng)該返回創(chuàng)建數(shù)組的構(gòu)造函數(shù)即這是數(shù)組返回這是數(shù)組從上例,我們可以知道即使全局作用域中已經(jīng)定義了變量或者已經(jīng)存在了屬性,但我們之后定義的變量則會(huì)覆蓋之前已經(jīng)定義好的或者已經(jīng)存在的變量屬性。 一.var 聲明與變量提升機(jī)制 在JavaScript中使用var定義一個(gè)變量,無(wú)論是定義在全局作用域函數(shù)函數(shù)的局部作用域中,都會(huì)被提升到其作用域的頂部,這也是...
摘要:允許在塊級(jí)作用域內(nèi)聲明函數(shù)。上面代碼中,存在全局變量,但是塊級(jí)作用域內(nèi)又聲明了一個(gè)局部變量,導(dǎo)致后者綁定這個(gè)塊級(jí)作用域,所以在聲明變量前,對(duì)賦值會(huì)報(bào)錯(cuò)。 ES5的作用域 變量起作用的范圍,js中能創(chuàng)建作用域的只能是函數(shù) { let a = 1; var b = 2; } console.log(a); // a is not defined console.log(b); //...
閱讀 3559·2021-10-09 09:43
閱讀 6172·2021-09-07 10:15
閱讀 2757·2019-08-30 14:03
閱讀 3087·2019-08-29 11:01
閱讀 1724·2019-08-29 10:56
閱讀 1087·2019-08-28 17:52
閱讀 3508·2019-08-26 11:42
閱讀 2563·2019-08-26 10:33