關於js的setTimeout執行順序


首先定義一個數組 在for循環中使用定時器輸出數組

1 var messages = ['1', '2', '3', '4']; 
2 for (var i = 0; i < messages.length; i ++) {
3 setTimeout(function(){
4 console.log(messages[i]); }, i*1000); 
5 }

 

執行輸出的是4個undefined

為什么不是輸出 1  2 3 4 呢 而是輸出underfined,這個問題期初以為是作用域的問題,最后百度了,終於找到其原因。

原因:setTimeout 使函數延遲1s執行,而for循環執行完成還不到0.1秒,到執行函數的時候,其實 i 已經變成4了,而數組下標最大數字是3,沒有對應的數組值,所以為underfined。

解決方法 1

使用let定義變量I,不要使用var。let 語句聲明一個塊級作用域的本地變量,並且可選的將其初始化為一個值。

1 var messages = ['1', '2', '3', '4']; 
2 for (let i = 0; i < messages.length; i ++) {
3 setTimeout(function(){
4 console.log(messages[i]); }, i*1000); 
5 }

 

解決方法2 加個閉包

1 var messages = ['1', '2', '3', '4'];
2 for (let i = 0; i < messages.length; i ++) {
3     (function(i){
4      setTimeout(function(){
5      console.log(messages[i]);
6      }, i*1000);
7      })(i);//這個的i一定要加進去,去掉函數的參數i,則函數內部沒有對i保持引用。
8      }

 

以上兩種方式都可以正常輸出 1 2 3 4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM