一道關(guān)于JavaScript變量作用域的面試題

字號:


    小編覺得這道題對理解JavaScript 作用域還是很有幫助的,特此又把自己的解題思路梳理了一遍,希望對其它人有所幫助。
    首先看下面試題:
    var arr = [1, 2, 3];
      for (var i = 0, j; j = arr[i++];) {
        console.log(j);
      }
      console.log('---------');
      console.log(i);
      console.log('---------');
      console.log(j);
      console.log('---------');
    在解題前,我們先回顧下 JavaScript 中,變量域相關(guān)的知識。
    全局變量(Global)
    全局變量是指在任何地方都可以訪問的變量,有兩種情況
    在 function 外面聲明,不論是否用 var 關(guān)鍵字
    在 function 里面聲明,不使用 var 關(guān)鍵字,當(dāng)然聲明的語句必須被執(zhí)行才可以
    局部變量(Local ) 
    局部變量只能在被聲明的 function 內(nèi)部才能訪問
    在 function 里面聲明,使用 var 關(guān)鍵字
    兩點(diǎn)要注意的地方
    先看代碼:
    alert(i); // 輸出 undefined
     for (var i = 0; i < 1; i++){};
     alert(i); // 輸出1
    JavaScript 不存在語句作用域,在語句內(nèi)定義的變量會(huì)擴(kuò)散到語句外邊, 例子中 i 在 for 語句中聲明,但是在 for 語句的外面任然可以訪問
    在 for 語句之前就可以訪問到 i ,只不過這時(shí)候還沒有被賦值
    開始我們的解題
    i++ 是在 i 使用后再自加:
    第一次執(zhí)行時(shí),j=arr[0],之后 i=1,console.log(j) 輸出 1
    第二次執(zhí)行時(shí),j=arr[1],之后 i=2,ocnsole.log(j) 輸出 2
    第三次執(zhí)行時(shí),j=arr[2],之后 i=3,ocnsole.log(j) 輸出 3
    第四次(不符合 for  條件),j=arr[3] 為 undefined,之后 i=4,ocnsole.log(j) 沒有輸出,退出 for 循環(huán)
    for 語句執(zhí)行結(jié)束后,console.log(i) 由上分析可知輸出 4,console.log(j) 輸出 undefined
    最后輸出結(jié)果為:
    2
    ---------
    ---------
    undefined
    ---------
    針對上面的分析和結(jié)果,想必大家都已經(jīng)搞清楚了吧,然后我們開始舉一反三吧。
    借題改題一
    題目:
    var arr = [1, 2, 3];
    for (var i = 0, j; j = arr[++i];) {
      console.log(j);
    }
    console.log('---------');
    console.log(i);
    console.log('---------');
    console.log(j);
    console.log('---------');
    答案:
    2
    3
    ---------
    3
    ---------
    undefined
    ---------
    借題改題二
    題目:
    function xxx() {
        var arr = [1, 2, 3];
        for (var i = 0, j; j = arr[i++];) {
          console.log(j);
        }
      }
      xxx();
      console.log('---------');
      console.log(i);
      console.log('---------');
      console.log(j);
      console.log('---------');
    答案:
    1
    2
    3
    ---------
    報(bào)錯(cuò):Uncaught ReferenceError: i is not defined
    為大家就分享到這,希望對大家理解JavaScript作用域有所幫助。