關(guān)于javascript作用域的常見(jiàn)面試題分享
本文主要給大家分享了關(guān)于javascript作用域面試題的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面來(lái)一起看看吧。
一、作用域:
在了解作用域之前,首先需要明白一些基礎(chǔ)概念:
每一個(gè)變量、函數(shù)都有其作用的范圍,超出作用不得使用,這個(gè)叫做作用域。
二、全局變量、局部變量:
1.全局變量:
(1)在全局范圍內(nèi)聲明的變量,如var a=1;
(2)只有賦值沒(méi)有聲明的值,如a=2;
(注:如果a=2在函數(shù)環(huán)境中,也是全局變量)
2.局部變量:
寫入函數(shù)中的變量,叫做局部變量。
3.作用:
(1)程序的安全。
(2)內(nèi)存的釋放。
三、作用域鏈:
查找量的過(guò)程。先找自己局部環(huán)境有沒(méi)有聲明或者是函數(shù),如果有,則查看聲明有無(wú)賦值或者是函數(shù)的內(nèi)容,如果沒(méi)有,則向上一級(jí)查找。
四、預(yù)解析順序:
每個(gè)程序都要做的工作,程序開(kāi)始先預(yù)解析語(yǔ)法,標(biāo)點(diǎn)符號(hào)是否有誤,解析內(nèi)存是否可容納,解析變量……直到解析無(wú)誤了,才開(kāi)始按正常的流程順序走。試想一下,如果沒(méi)有預(yù)解析順序,直接按流程順序走,可能程序執(zhí)行到最后一個(gè)函數(shù),發(fā)現(xiàn)了語(yǔ)法錯(cuò)誤,才開(kāi)始報(bào)錯(cuò),那性能要有多差啊!
順序內(nèi)容:
1.文件內(nèi)引用的<script>塊依次解析,從上到下連成一片。
2.每個(gè)script塊內(nèi)部的var(注意:只解析變量名,不解析值,如var a=2;
將var a解析在環(huán)境的開(kāi)頭,并不解析后面的值,只有當(dāng)程序執(zhí)行到var a=2
這行時(shí),才會(huì)給變量賦值),function解析到本塊的開(kāi)頭。
3.依次解析每個(gè)環(huán)境,將var
,function
解析到環(huán)境的開(kāi)頭。
五、應(yīng)用場(chǎng)景(一些常見(jiàn)的作用域相關(guān)的面試題):
var a="aa"; function test(){ alert(a);//undefined,函數(shù)執(zhí)行后,在函數(shù)環(huán)境內(nèi),var a會(huì)預(yù)解析,當(dāng)彈出a時(shí),首先先找本層環(huán)境內(nèi)有無(wú)聲明,發(fā)現(xiàn)有。但是代碼沒(méi)有執(zhí)行到賦值,所以結(jié)果是undefined。 var a="bb";//var a會(huì)預(yù)解析在函數(shù)開(kāi)頭,執(zhí)行到這行才進(jìn)行賦值 alert(a);//“bb” } test(); alert(a);//"aa" 找全局環(huán)境下的聲明,找到了var a="aa"
var a="aa"; function test(){ alert(a);//“aa”,函數(shù)執(zhí)行后,在函數(shù)環(huán)境內(nèi),沒(méi)有找到本層環(huán)境關(guān)于a的聲明,所以開(kāi)始向上一層環(huán)境查找。 a="bb";//執(zhí)行到這行開(kāi)始改變?nèi)謅的量 } test(); alert(a);//"bb" 全局環(huán)境的a在函數(shù)執(zhí)行時(shí)已經(jīng)被改變
function test(){ b();//函數(shù)b會(huì)被預(yù)解析,因此可以調(diào)用,執(zhí)行了輸出1; var a=1; function b(){ console.log(1); console.log(a);//undefined var a=2; } } test();
六、總結(jié):
要搞清楚一個(gè)變量的作用域,重點(diǎn)是搞清楚預(yù)解析順序,然后再判斷作用域的范圍,這些都是有套路可言:先找本層環(huán)境有無(wú)聲明,有的話,看是否進(jìn)行了賦值;只有聲明沒(méi)有執(zhí)行賦值,就是undefined。沒(méi)有聲明也沒(méi)有賦值的話,就再向上一層查找,直到找到為止。如果所有的執(zhí)行環(huán)境都沒(méi)有找到,那么控制臺(tái)就會(huì)報(bào)錯(cuò)變量找不到。
函數(shù)的話就更簡(jiǎn)單了:找本層環(huán)境是否有預(yù)解析的函數(shù),有的話即可執(zhí)行。沒(méi)有的話還是向上查找。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
JavaScript實(shí)現(xiàn)電燈開(kāi)關(guān)小案例
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)電燈開(kāi)關(guān)小案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03基于javascript實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘效果
這篇文章主要為大家詳細(xì)介紹了基于javascript實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘效果的相關(guān)資料,動(dòng)態(tài)顯示系統(tǒng)當(dāng)前時(shí)間,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02Bootstrap 填充Json數(shù)據(jù)的實(shí)例代碼
本篇文章主要介紹了Bootstrap 填充Json數(shù)據(jù)的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01layui 圖片上傳+表單提交+ Spring MVC的實(shí)例
今天小編就為大家分享一篇layui 圖片上傳+表單提交+ Spring MVC的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09JavaScript比較當(dāng)前時(shí)間是否在指定時(shí)間段內(nèi)的方法
這篇文章主要介紹了JavaScript比較當(dāng)前時(shí)間是否在指定時(shí)間段內(nèi)的方法,涉及javascript時(shí)間與字符串的轉(zhuǎn)換及比較操作相關(guān)技巧,需要的朋友可以參考下2016-08-08JS日期對(duì)象簡(jiǎn)單操作(獲取當(dāng)前年份、星期、時(shí)間)
這篇文章主要介紹了JS日期對(duì)象簡(jiǎn)單操作,獲取當(dāng)前年份、星期、時(shí)間等代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10