經典面試題,循環中使用閉包解決 var 定義函數的問題--閉包


閉包的定義很簡單:函數 A 返回了一個函數 B,並且函數 B 中使用了函數 A 的變量,函數 B 就被稱為閉包。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>var定義函數出現的問題</title>
</head>
<body>
<script type="text/javascript">
// 經典面試題,循環中使用閉包解決var定義的問題
for(var i=1;i<=5;i++){
setTimeout(function timer(){
console.log(i)
},i*100)
}// 6 6 6 6 6
// 首先因為 setTimeout 是個異步函數,所有會先把循環全部執行完畢,這時候 i 就是 6 了,所以會輸出一堆 6。

// 解決方案:第一種:使用閉包
for(var k=1;k<=5;k++){
(function(j){
setTimeout(function fa1(){
console.log(j)
},j*1000)
})(k);
}

// 第二種使用setTimeout的第三個參數
for(var m=1;m<=5;m++){
setTimeout(function fa2(l) {
console.log(l);
},m*1000,m)
}

// 第三種方案:使用let定義i
for(let u=1;u<=5;u++){
setTimeout(function l3(){
console.log(u)
},u*1000)
}

</script>
</body>
</html>


免責聲明!

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



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