昨晚在一個交流群裡看到有位網友提了一個他的面試題求助答疑。剛好我也有看到,就對這個問題思考了一下,覺得這道題對理解 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 中,變量域相關的知識。
全局變量是指在任何地方都可以訪問的變量,有兩種情況
兩點要注意的地方
先看代碼:
alert(i); // 輸出 undefined for (var i = 0; i < 1; i++){}; alert(i); // 輸出1
開始我們的解題
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 --------- --------- undefined ---------
針對上面的分析和結果,想必大家都已經搞清楚了吧,然後我們開始舉一反三吧。
題目:
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 --------- 報錯:Uncaught ReferenceError: i is not defined