被這個問題困惑了很久,終於在網上找到了答案,感謝~
現在分享給大家~
js中如何讓一個for循環走完之后,再去執行下面的語句?
這涉及for循環變量作用域的問題,js中作用域只有函數作用域和全局作用域,在函數體內使用var 定義的變量,會被提到函數開始處進行定義,作用域為整個函數,常見的誤區如下:
var a=[]; for(var i = 0;i<10;i++){ var q = i; a[i]=function(){console.log(q)} } a[0]() 其中,由於for循環並不是一個函數體,所以for循環中定義的變量q和i是作用域for循環所在的函數體,和a同級, i++ 和 q=i 並不是重新定義變量,只是重復賦值,最終循環結束,i = 10,q=9; 由於function(){console.log(q)} 並不是立即執行,所以這里的q一直是存儲的內存引用,最終所有的a[i]()都是輸出 9 不過,在es6中新增了let命令聲明變量,用法和var類似,不過let所聲明的變量,只在let命令所在的代碼塊有效果,for循環的計數器中就很適合let命令 var a=[]; for(let i = 0;i<10;i++){ ley q = i; a[i]=function(){console.log(q)} } a[6]() //這里會輸出 6 let聲明的變量僅在塊級作用域有效,所以這里的i只在本輪循環有效果,每次循環的i其實都是一個新的變量
以上內容轉載自http://blog.csdn.net/kai_l/article/details/50913505。