在js中碌奉,作用域是最基礎(chǔ)短曾,最重要的東西寒砖,讓我們來(lái)看看什么叫做作用域
作用域簡(jiǎn)單來(lái)講就是對(duì)標(biāo)識(shí)符的一個(gè)訪問(wèn)規(guī)則,什么叫做標(biāo)識(shí)符呢嫉拐?比如申明一個(gè)變量哩都,var a = 2;那么2的標(biāo)識(shí)符就是這個(gè)a,這個(gè)a同時(shí)也可以叫做變量名婉徘。
js中作用域分為兩個(gè)部分漠嵌,一個(gè)叫詞法作用域,一個(gè)叫動(dòng)態(tài)作用域盖呼。
詞法作用域主要是由申明標(biāo)識(shí)符的位置來(lái)決定的儒鹿,詞法作用域主要分為兩種,一種叫做全局作用域几晤,一般指的是<script>....</script>中間的這一塊约炎,另一種叫做函數(shù)作用域,比如 function a(){},這個(gè)a函數(shù)里面的東西都包裹在a函數(shù)中蟹瘾。全局作用域是無(wú)法訪問(wèn)函數(shù)作用域中的標(biāo)識(shí)符圾浅,但函數(shù)作用域中的標(biāo)識(shí)符,如果查找不到热芹,會(huì)去全局作用域中查找贱傀,這種一層一層的查找關(guān)系就是作用域鏈。
根據(jù)上面兩張圖伊脓,在圖1中府寒,如果在全局的環(huán)境中訪問(wèn)變量a,它的值是1报腔,函數(shù)中的變量a重新賦值株搔,并不會(huì)影響到全局中的變量a,圖2中纯蛾,在函數(shù)內(nèi)部訪問(wèn)變量a纤房,但函數(shù)中并沒(méi)有申明過(guò)變量a,所以會(huì)順著作用域鏈去查找到在全局環(huán)境中的變量a
在變量申明中翻诉,會(huì)出現(xiàn)變量申明提前的情況:
在圖3中炮姨,在第一行中打印沒(méi)有被申明的變量a出現(xiàn)undefined而不是未定義,是因?yàn)樽兞康纳昝鲿?huì)被提前碰煌,var a = 1舒岸,這句話會(huì)被拆分成兩句:
var a;
a = 1;
也就是說(shuō)圖3中直接打印a就等同于圖4這種情況。
動(dòng)態(tài)作用域:指的就是作用域是在代碼運(yùn)行時(shí)才存在的這種情況芦圾,比如關(guān)鍵字this其實(shí)就是動(dòng)態(tài)作用域的一種表現(xiàn)形式蛾派。因this涉及的東西比較多,所以打算在下一篇中詳細(xì)的說(shuō)明下。