作用域和作用域鏈
作用域:決定了代碼區(qū)塊中變量和其他資源的可見(jiàn)性;
作用域最大的用處就是變量隔離,不同的作用域先同名變量不會(huì)沖突;
·全局作用域和函數(shù)作用域
擁有全局作用域:
·最外層函數(shù) 和在最外層函數(shù)外面定義的變量擁有全局作用域
·所有末定義直接賦值的變量自動(dòng)聲明為擁有全局作用域
·所有window對(duì)象的屬性擁有全局作用域
作用域是分層的內(nèi)部可以訪問(wèn)到外層作用域的變量反之則不行;
值得注意的是:
塊語(yǔ)句(大括號(hào)“{}”中間的語(yǔ)句),如 if 和 switch 條件語(yǔ)句或 for 和 while 循環(huán)語(yǔ)句,不像函數(shù),它們不會(huì)創(chuàng)建一個(gè)新的作用域。
在塊語(yǔ)句中定義的變量將保留在它們已經(jīng)存在的作用域中。
作用域鏈
當(dāng)出現(xiàn)自由變量的時(shí)候要找到這個(gè)自由變量(當(dāng)前作用域沒(méi)有定義),就要去他們父級(jí)作用域查找,若沒(méi)有再向上一層去查找;
直到找到全局作用結(jié)束;這一層一層的關(guān)系就是作用域鏈
自由變量的取值:要到創(chuàng)建這個(gè)函數(shù)的作用域查找取值;(強(qiáng)調(diào)的是創(chuàng)建而不是調(diào)用)
作用域和執(zhí)行上下文的區(qū)別:
執(zhí)行上下文是執(zhí)行的時(shí)候創(chuàng)建的,隨時(shí)會(huì)改變;作用域是定義的時(shí)候確定的不能改變;
同一個(gè)作用域下會(huì)產(chǎn)生不同的執(zhí)行上下文環(huán)境,從而會(huì)產(chǎn)生不同的變量值
JavaScript的執(zhí)行分為:解釋和執(zhí)行兩個(gè)階段,這兩個(gè)階段所做的事并不一樣:
解釋階段:
- 詞法分析
- 語(yǔ)法分析
- 作用域規(guī)則確定
執(zhí)行階段:
- 創(chuàng)建執(zhí)行上下文
- 執(zhí)行函數(shù)代碼
- 垃圾回收
到這 應(yīng)該理解了作用域和作用域鏈了吧?。?! ?? ??