從閉包引出來的一系列問題

2021-09-13 10:12:45 字數 1645 閱讀 7520

for(var i = 0; i < 5; i++) , 1000)

}console.log(new date, i)

很明顯,由於非同步的作用。到最後輸出的結果為6個5

如果用箭頭表示前後兩次輸出有1s的間隔,用,代表前後一起輸出,那麼輸出結果是5->5,5,5,5,5

這個也很容易的就可以進行解釋,先執行console.log(),再進行settimeout()的非同步操作。

首先可以使用閉包來解決這個問題:

for(var i = 0; i < 5; i++) , 1000)

})(i)

}console.log(new date, i) // 5

利用立即執行函式,來解決閉包造成的問題。

此外還可以使用settimeout的第三個引數 文件:

for(var i = 0; i < 5; i++) , 1000, i)

}console.log(new date, i) // 5

可能會有很多同學採用es6的方式來避免:

for(let i = 0; i < 5; i++) , 1000)

}console.log(new date, i)

但是此時並不能正確輸出我們想要的結果,因為let宣告的 i 產生了塊級作用域,導致 for 迴圈外面的輸出不能獲取的 i ,所以此時會報錯i is not defined

其中一種比較容易想到的方法:

for(var i = 0; i < 5; i++) , 1000*j)

})(i)

}settimeout(function() , 1000*i)

但是js中定時器的觸發時機是不確定的,每次迴圈都會產生乙個非同步操作之後,會有乙個輸出,那麼完全可以使用promise來解決這個問題。

const tasks = 

for(var i = 0; i < 5; i++) , j*1000)

}))})(i)

}promise.all(tasks).then( () => , 1000)

})

將上面**處理一下:

const tasks = 

const output = function(i) , 1000*i)

})}for(var i = 0;i < 5; i++)

// 全部promise執行完畢,執行最後乙個輸出i

promise.all(tasks).then( () => , 1000)

})

// 模擬sleep

const sleep = (time) => new promise((resolve) => );

(async () =>

console.log(new date, i);

}await sleep(1000);

console.log(new date, i);

})();

遭遇select標籤一系列問題

1.設定選擇項,在ie6下要特別注意 下面的寫法ie6下有問題 j sy 0 selectedindex i 下面的寫法相容ie6,7,ff j sy 0 options i setattribute selected true 2.innerhtml,這個在ie下要特別注意。jquery的html...

mysql自動備份一系列問題

mysql自動備份一系列問題 測試環境終於搭建好了。伺服器選擇了mysql server 5.5.28,key驗證資訊也通過了,看來還是系統沒裝對。啟動資料庫 etc init.d mysql start 開始測試 首先連線mysql mysql u root p 初始密碼為空,直接回車。之後建立乙...

oracle 監聽相關的 一系列問題

自己裝了oracle 10.2.0後發現沒有listener.ora 便從網上找了個如下 generated by oracle configuration tools.listener description list description address protocol tcp host 1...