ShineJaie 原創,轉載請註明出處。 昨晚在一個交流群里看到有位網友提了一個他的面試題求助答疑。剛好我也有看到,就對這個問題思考了一下,覺得這道題對理解 JavaScript 作用域還是很有幫助的,特此又把自己的解題思路梳理了一遍,希望對其它人有所幫助。 首先看下麵試題: 1 var arr
ShineJaie 原創,轉載請註明出處。
昨晚在一個交流群里看到有位網友提了一個他的面試題求助答疑。剛好我也有看到,就對這個問題思考了一下,覺得這道題對理解 JavaScript 作用域還是很有幫助的,特此又把自己的解題思路梳理了一遍,希望對其它人有所幫助。
首先看下麵試題:
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)
全局變數是指在任何地方都可以訪問的變數,有兩種情況
- 在 function 外面聲明,不論是否用 var 關鍵字
- 在 function 裡面聲明,不使用 var 關鍵字,當然聲明的語句必須被執行才可以
局部變數(Local )
局部變數只能在被聲明的 function 內部才能訪問- 在 function 裡面聲明,使用 var 關鍵字
兩點要註意的地方
先看代碼:
1 alert(i); // 輸出 undefined 2 3 for (var i = 0; i < 1; i++){}; 4 5 alert(i); // 輸出1
- JavaScript 不存在語句作用域,在語句內定義的變數會擴散到語句外邊, 例子中 i 在 for 語句中聲明,但是在 for 語句的外面任然可以訪問
- 在 for 語句之前就可以訪問到 i ,只不過這時候還沒有被賦值
開始我們的解題
i++ 是在 i 使用後再自加:
第一次執行時,j=arr[0],之後 i=1,console.log(j) 輸出 1
第二次執行時,j=arr[1],之後 i=2,ocnsole.log(j) 輸出 2
第三次執行時,j=arr[2],之後 i=3,ocnsole.log(j) 輸出 3
第四次(不符合 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