昨晚在一個交流羣裏看到有位網友提了一個他的面試題求助答疑。恰好我也有看到,就對這個問題思考了一下,以爲這道題對理解 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 中,變量域相關的知識。面試
全局變量是指在任何地方均可以訪問的變量,有兩種狀況spa
兩點要注意的地方code
先看代碼:htm
1 alert(i); // 輸出 undefined 2 3 for (var i = 0; i < 1; i++){}; 4 5 alert(i); // 輸出1
開始咱們的解題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