经典面试题,循环中使用闭包解决 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>

猜你喜欢

转载自www.cnblogs.com/Richard-M/p/10432340.html