经典面试题,循环中使用闭包解决 var 定义函数的问题--闭包
Posted richard-m
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典面试题,循环中使用闭包解决 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>
以上是关于经典面试题,循环中使用闭包解决 var 定义函数的问题--闭包的主要内容,如果未能解决你的问题,请参考以下文章