溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

關(guān)于javascript作用域的常見面試題分享

發(fā)布時(shí)間:2020-09-29 15:25:29 來源:腳本之家 閱讀:171 作者:這麻雀 欄目:web開發(fā)

本文主要給大家分享了關(guān)于javascript作用域面試題的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面來一起看看吧。

一、作用域:

在了解作用域之前,首先需要明白一些基礎(chǔ)概念:

每一個(gè)變量、函數(shù)都有其作用的范圍,超出作用不得使用,這個(gè)叫做作用域。

二、全局變量、局部變量:

1.全局變量:

     (1)在全局范圍內(nèi)聲明的變量,如var a=1;

     (2)只有賦值沒有聲明的值,如a=2; (注:如果a=2在函數(shù)環(huán)境中,也是全局變量)

2.局部變量:

      寫入函數(shù)中的變量,叫做局部變量。

3.作用:

     (1)程序的安全。

     (2)內(nèi)存的釋放。

三、作用域鏈:

查找量的過程。先找自己局部環(huán)境有沒有聲明或者是函數(shù),如果有,則查看聲明有無賦值或者是函數(shù)的內(nèi)容,如果沒有,則向上一級(jí)查找。

四、預(yù)解析順序:

每個(gè)程序都要做的工作,程序開始先預(yù)解析語法,標(biāo)點(diǎn)符號(hào)是否有誤,解析內(nèi)存是否可容納,解析變量……直到解析無誤了,才開始按正常的流程順序走。試想一下,如果沒有預(yù)解析順序,直接按流程順序走,可能程序執(zhí)行到最后一個(gè)函數(shù),發(fā)現(xiàn)了語法錯(cuò)誤,才開始報(bào)錯(cuò),那性能要有多差??!

順序內(nèi)容:

      1.文件內(nèi)引用的<script>塊依次解析,從上到下連成一片。

      2.每個(gè)script塊內(nèi)部的var(注意:只解析變量名,不解析值,如var a=2;將var a解析在環(huán)境的開頭,并不解析后面的值,只有當(dāng)程序執(zhí)行到var a=2這行時(shí),才會(huì)給變量賦值),function解析到本塊的開頭。

      3.依次解析每個(gè)環(huán)境,將var,function解析到環(huán)境的開頭。

五、應(yīng)用場(chǎng)景(一些常見的作用域相關(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)有無聲明,發(fā)現(xiàn)有。但是代碼沒有執(zhí)行到賦值,所以結(jié)果是undefined。
 var a="bb";//var a會(huì)預(yù)解析在函數(shù)開頭,執(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),沒有找到本層環(huán)境關(guān)于a的聲明,所以開始向上一層環(huán)境查找。
 a="bb";//執(zhí)行到這行開始改變?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)境有無聲明,有的話,看是否進(jìn)行了賦值;只有聲明沒有執(zhí)行賦值,就是undefined。沒有聲明也沒有賦值的話,就再向上一層查找,直到找到為止。如果所有的執(zhí)行環(huán)境都沒有找到,那么控制臺(tái)就會(huì)報(bào)錯(cuò)變量找不到。

函數(shù)的話就更簡單了:找本層環(huán)境是否有預(yù)解析的函數(shù),有的話即可執(zhí)行。沒有的話還是向上查找。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI