Javascript中的“域”、“預(yù)”、“譯”,你真的掌握了嗎?
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
一、作用域的概念1、作用域有三種:全局作用域、函數(shù)作用域、塊級作用域。(模塊作用域) (1)全局作用域:這時最高級別的作用域,在這定義的函數(shù)以及變量可以在代碼的所有地方被訪問。在瀏覽器的環(huán)境中,全局變量實際是window對象的屬性。例如:
(2)函數(shù)作用域(局部作用域):在每個函數(shù)內(nèi)部聲明的變量(未使用const、let關(guān)鍵字)、function聲明的函數(shù),這些對象具有局部作用域,它們只可以在函數(shù)內(nèi)部訪問。例如:
(3)塊級作用域:這個作用域是在ES6引入了let和const關(guān)鍵字,避免因var聲明的變量的變量提升(接下來會進(jìn)行解釋)現(xiàn)象,導(dǎo)致的讓人匪夷所思的行為。這個作用域可以簡單的理解為:{} + let/const例如:
注:(1) 以上作用域所指的是全局內(nèi)、函數(shù)體內(nèi)、塊內(nèi)的域,而詞法作用域則是變量聲明的地方,注意不是調(diào)用的地方。例如:我們的寢室是一個域,則該域的詞法作用域就是這一棟寢室樓。 (2)欺騙詞法作用域:
2、聲明提升的概念與示例 概念:在變量聲明和函數(shù)聲明在代碼執(zhí)行前被提升,或者說移到,其包含的作用域的頂部的過程,發(fā)生在JS的編譯階段,導(dǎo)致了變量和函數(shù)可以在被聲明之前就被訪問。
即使函數(shù)
二、“預(yù)備與編譯”--預(yù)編譯的概念1、預(yù)編譯發(fā)生在代碼被執(zhí)行之前,是JS引擎對代碼的預(yù)處理,保證了變量和函數(shù)在使用之前已經(jīng)被正確的設(shè)置。 2、全局預(yù)編譯: (1)創(chuàng)建全局執(zhí)行上下文GO(Global Object)。 (2)尋找變量聲明,變量名作為GO的屬性名,值為undefined。 (3)在全局找函數(shù)聲明,函數(shù)名作為GO的屬性名,值為函數(shù)體 畫圖實例:
3、函數(shù)中的預(yù)編譯 (1)創(chuàng)建函數(shù)的執(zhí)行上下文對象AO(Activation Object)。 (2)找到形參和變量聲明,將形參和變量聲明作為AO的屬性名,值為undefined。 (3)將實參和形參統(tǒng)一 (4)在函數(shù)體內(nèi)找到函數(shù)聲明,將函數(shù)名作為AO的屬性名,值為函數(shù)體。 畫圖實例: 注: 以上的執(zhí)行上下文是被放在一個棧內(nèi),AO對象被放在變量環(huán)境中。在執(zhí)行上下文中除了變量環(huán)境外,還有一個詞法環(huán)境,用于 畫圖實例:
該文章在 2024/5/29 10:44:20 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |