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