徹底搞懂JS作用域和作用域鏈

作用域和作用域鏈

作用域:決定了代碼區(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)該理解了作用域和作用域鏈了吧?。?! ?? ??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容