JavaScript 關於變量做用域的一道面試題

ShineJaie 原創,轉載請註明出處。

昨晚在一個交流羣裏看到有位網友提了一個他的面試題求助答疑。恰好我也有看到,就對這個問題思考了一下,以爲這道題對理解 JavaScript 做用域仍是頗有幫助的,特此又把本身的解題思路梳理了一遍,但願對其它人有所幫助。html

首先看下面試題:

 1     var arr = [1, 2, 3];  2     for (var i = 0, j; j = arr[i++];) {  3  console.log(j);  4  }  5 
 6     console.log('---------');  7  console.log(i);  8     console.log('---------');  9  console.log(j); 10     console.log('---------');

 

在解題前,咱們先回顧下 JavaScript 中,變量域相關的知識。面試

全局變量(Global)

全局變量是指在任何地方均可以訪問的變量,有兩種狀況spa

  • 在 function 外面聲明,不管是否用 var 關鍵字
  • 在 function 裏面聲明,不使用 var 關鍵字,固然聲明的語句必須被執行才能夠

局部變量(Local ) 

局部變量只能在被聲明的 function 內部才能訪問
  • 在 function 裏面聲明,使用 var 關鍵字

兩點要注意的地方code

先看代碼:htm

1 alert(i); // 輸出 undefined
2 
3 for (var i = 0; i < 1; i++){};
4 
5 alert(i); // 輸出1
  • JavaScript 不存在語句做用域,在語句內定義的變量會擴散到語句外邊, 例子中 i 在 for 語句中聲明,可是在 for 語句的外面任然能夠訪問
  • 在 for 語句以前就能夠訪問到 i ,只不過這時候尚未被賦值

開始咱們的解題blog

i++ 是在 i 使用後再自加:ip

第一次執行時,j=arr[0],以後 i=1,console.log(j) 輸出 1 作用域

第二次執行時,j=arr[1],以後 i=2,ocnsole.log(j) 輸出 2get

第三次執行時,j=arr[2],以後 i=3,ocnsole.log(j) 輸出 3io

第四次(不符合 for  條件),j=arr[3] 爲 undefined,以後 i=4,ocnsole.log(j) 沒有輸出,退出 for 循環

for 語句執行結束後,console.log(i) 由上分析可知輸出 4,console.log(j) 輸出 undefined

最後輸出結果爲:

1
2
3
---------
4
---------
undefined
---------

針對上面的分析和結果,想必你們都已經搞清楚了吧,而後咱們開始觸類旁通吧。

借題改題一

題目:

 1     var arr = [1, 2, 3];  2     for (var i = 0, j; j = arr[++i];) {  3  console.log(j);  4  }  5 
 6     console.log('---------');  7  console.log(i);  8     console.log('---------');  9  console.log(j); 10     console.log('---------');

答案:

1 2 2 3 3 --------- 4 3 5 --------- 6 undefined 7 ---------

借題改題二

題目:

 1     function xxx() {  2         var arr = [1, 2, 3];  3         for (var i = 0, j; j = arr[i++];) {  4  console.log(j);  5  }  6  }  7  xxx();  8 
 9     console.log('---------'); 10  console.log(i); 11     console.log('---------'); 12  console.log(j); 13     console.log('---------');

答案:

1
2
3
--------- 報錯:Uncaught ReferenceError: i is not defined
相關文章
相關標籤/搜索