這篇文章主要講解了“JavaScript塊級(jí)作用域的實(shí)現(xiàn)原理是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“JavaScript塊級(jí)作用域的實(shí)現(xiàn)原理是什么”吧!
創(chuàng)新互聯(lián)建站長(zhǎng)期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為白堿灘企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站制作,白堿灘網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
很多人覺得作用域與執(zhí)行上下文是一個(gè)概念,這種想法是完全錯(cuò)誤的!
作用域在函數(shù)聲明時(shí)就已經(jīng)確定了,作用域是據(jù)名稱來查找變量的一套規(guī)則,也就是確定了當(dāng)前執(zhí)行代碼對(duì)變量的訪問權(quán)限。JavaScript一共支持三種類型的作用域,它們分別是:全局作用域、函數(shù)作用域、塊級(jí)作用域。
執(zhí)行上下文是js引擎從解釋到運(yùn)行中間預(yù)編譯時(shí)對(duì)執(zhí)行做的準(zhǔn)備工作,創(chuàng)建了當(dāng)前區(qū)域的執(zhí)行環(huán)境,這個(gè)執(zhí)行環(huán)境就是執(zhí)行上下文。
調(diào)用棧用來裝js代碼中的各種執(zhí)行上下文,是js引擎追蹤函數(shù)執(zhí)行的一個(gè)機(jī)制。
以下面的代碼為例:
console.log(1); function pFn() { console.log(2); (function cFn() { console.log(3); }()); console.log(4); } pFn(); console.log(5); //輸出:1 2 3 4 5
先有全局環(huán)境下的執(zhí)行上下文,調(diào)用pFn后將函數(shù)環(huán)境pFn的執(zhí)行上下文壓入棧中,由于pFn中執(zhí)行了cFn函數(shù),所以繼續(xù)壓入cFn函數(shù)的執(zhí)行上下文,執(zhí)行完畢后依次出棧。
全局上下文只有應(yīng)用程序退出前才會(huì)被銷毀,比如關(guān)閉網(wǎng)頁(yè)或者退出瀏覽器
我們知道在js中由于初始設(shè)計(jì)的不規(guī)范,用var關(guān)鍵字定義變量會(huì)導(dǎo)致變量提升等一系列問題,但為了保持兼容性,我們也不得不對(duì)var聲明變量這種方式保留支持,那么:JavaScript是如何做到既要支持變量提升,又要支持塊級(jí)作用域的呢?
我們以下面這段代碼為例:
function foo() { var a = 1; let b = 2; { let b = 3; var c = 4; let d = 5; console.log(a); console.log(b); } console.log(b); console.log(c); console.log(d); }
首先函數(shù)內(nèi)部通過var聲明的變量被存放到變量環(huán)境中,通過let聲明的變量在預(yù)編譯階段被存放到詞法環(huán)境中,當(dāng)然在函數(shù)體內(nèi)部塊作用域中l(wèi)et聲明的變量并沒有被存放到詞法環(huán)境中。
繼續(xù)執(zhí)行代碼,當(dāng)執(zhí)行到代碼塊里面時(shí),變量環(huán)境中的a的值已經(jīng)被設(shè)置為1,詞法環(huán)境中b的值已經(jīng)被設(shè)置成了2,注意用let聲明的變量b和d此時(shí)不是underfined而是uninitialized未初始化
最后當(dāng)函數(shù)體內(nèi)塊作用域執(zhí)行結(jié)束之后,其內(nèi)部變量就會(huì)從詞法環(huán)境的棧頂彈出
感謝各位的閱讀,以上就是“JavaScript塊級(jí)作用域的實(shí)現(xiàn)原理是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)JavaScript塊級(jí)作用域的實(shí)現(xiàn)原理是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!