JS中for循環變量做用域--解決for循環異步執行的問題

被這個問題困惑了好久,終於在網上找到了答案,感謝~es6

如今分享給你們~segmentfault

 

 

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。post

相關文章
相關標籤/搜索