詞法作用域
一蒙揣、作用域
定義:就是作用范圍
作用域說明的是一個變量可以在什么地方被使用歹河,什么地方不能被使用唠摹。
1.塊級作用域
JavaScript中沒有塊級作用域概念
所以只要聲明過的變量屏富,在訪問的時候就不會報錯发皿。
在JavaScript中作用域規(guī)則:
- 函數(shù)允許訪問函數(shù)外的數(shù)據(jù)
- 整個代碼結(jié)構(gòu)中只有函數(shù)可以限定作用域
- 作用域規(guī)則首先使用特生規(guī)則分析
- 如果當(dāng)前作用規(guī)則中沒有名字了,就不考慮外面的名字炒考。
二可缚、變量提升
fun();
function(){
alert(123);
}
//實際語法中沒有報錯,因為JavaScript并非在運行簡單的逐句解析執(zhí)行斋枢。
JavaScript預(yù)解析
JavaScript引擎在對JavaScript進行解釋執(zhí)行之前帘靡,會對JavaScript代碼進行預(yù)解析階段,會以關(guān)鍵字var
和function
開頭的語句塊提前進行處理瓤帚。
當(dāng)變量和函數(shù)聲明的處在作用域比較靠后的位置的時候描姚,變量和函數(shù)的聲明會被提升到作用域的開頭涩赢。
聲明、定義轩勘、初始化
的區(qū)別:
- 聲明:告訴解析器有這個變量存在筒扒,這個行為是不分配內(nèi)存空間的,在JavaScript中绊寻,聲明一個變量的操作為
var a;
- 定義:在變量分配內(nèi)存空間花墩,在C語言中,一般生命就包含了定義澄步,比如:int a;但在JavaScript中冰蘑,var a 這種形式只是聲明。
- 初始化:在定義變量之后村缸,系統(tǒng)為變量分配的空間內(nèi)存儲的值是不確定的懂缕,所以需要對這個空間進行初始化,以確保程序的安全性和確定性王凑。
- 賦值:賦值就是變量在分配空間之后的某個時間里,對變量的值進行刷新操作(修改存儲空間內(nèi)的數(shù)據(jù))
所以聋丝,本文提到的提升索烹,是聲明的提升。
預(yù)解析是分作用域的
聲明變量并不是將所有的聲明都提升到window對象下面弱睦,提升原則是提升到變量運行的環(huán)境(作用域)中百姓。
函數(shù)表達式并不會被提升
func();
var func = function(){
alert("我被提升了");
}
//這里會直接寶座找不到函數(shù),原因是var fun = function(){}况木,這種函數(shù)表達式垒拢,并不會被提升,只是簡單了對變量進行了處理火惊。
三求类、作用域鏈
什么是作用域鏈?只有函數(shù)可以制造作用域結(jié)構(gòu)屹耐,只要是代碼尸疆,就至少有一個作用域,即全局作用域惶岭。
凡是代碼中有函數(shù)寿弱,那么這個函數(shù)就構(gòu)成另一個作用域。如果函數(shù)中還有函數(shù)按灶,那么在這個作用域就又可以誕生一個作用域症革。將這樣的作用域列出來,就會出現(xiàn)一個結(jié)構(gòu)鸯旁,函數(shù)內(nèi)指向函數(shù)外的鏈?zhǔn)浇Y(jié)構(gòu)噪矛,稱為作用域鏈量蕊。