<script> for(var i=0;i<10;i++){ setTimeout(function(){ alert(i); },1000); } </script>这个闭包为什么每次只打印10,

文章解释了JavaScript中for循环和setTimeout函数的交互,强调了当在for循环内部使用setTimeout时,由于异步特性,会创建10个独立的setTimeout函数,每个对应循环中的一个i值,而非在循环结束后统一执行。通过改用立即执行函数,解决了变量作用域问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题代码

for(var i=0;i<10;i++){
			console.log(i)
				setTimeout(function(){
					console.log(i)
				},1000);
		}
setTimeout是一次执行函数,这里是1秒后执行,仅仅执行一次;for(var i=0;i<10;i++),i的每次取值都是执行setTimeout这个函数,并没有执行setTimeout里面的function(即闭包函数),setTimeout里面的function是有setTimeout的定时触动的,也就是1秒后执行,也就是说i从0~9时,一共执行了10次的setTimeout()函数,此时的i的值是10,由于for语句的执行速度远小于1秒,所以,1秒后,由setTimeout()函数定时触动的闭包函数function()开始执行,alert(i);i的值已经是10了,所以相继打印10次i.

修改代码

	for(var i=0;i<10;i++){	
			(function(i){
				setTimeout(function(){
					console.log(i)
				},1000);}
			)
		(i)}

 

<html> <head> <script src="https://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <!-- 可选的 Bootstrap 主题文件(一般不用引入) --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"> <!-- 最新的 Bootstrap 核心 JavaScript 文件 --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> <script lang="javascript"> </script> </head> <body> <form> <div style="width:500px;margin:10px auto;text-align: center;"> <div style="font-size:28px;font-weight:bold;margin:0px auto;">user signup</div> <br /> <table style="width:100%;text-align: left;"> <tbody> <tr style="margin-bottom: 20px;"> <td> <span class="p">*</span> <label for="username" class="l"> new username:</label> </td> <td> <input id="username" type="text" style="height:30px;width:250px;padding-right:50px;"> </td> </tr> <tr> <td><br></td> <td></td> </tr> <tr style="margin-bottom: 20px;"> <td> <span class="p">*</span> <label for="password" class="l"> password:</label> </td> <td> <input id="password" type="text" style="height:30px;width:250px;padding-right:50px;"> </td> </tr> <tr> <td><br></td> <td></td> </tr> <tr style="margin-bottom: 20px;"> <td> <span class="p">*</span> <label for="passwordc" class="l"> repeated password:</label> </td> <td> <input id="passwordc" type="text" style="height:30px;width:250px;padding-right:50px;"> </td> </tr> <tr> <td><br></td> <td></td> </tr> <tr> <td> </td> <td> <input class="btn btn-success" type="button" style="margin:0 auto;width:250px;" value="click to signup" onclick='onSignup()' /> <label name='login_hint' id='login_hint' style='display:none'>sigup success!</label> </td> </tr> </tbody> </table> </div> </form> </body> <script lang="javascript"> function onSignup() { var username = document.getElementById('username'); var password = document.getElementById('password'); $.ajax({ url: "/user/signup", type: "POST", data: { "username": username.value, "password": password.value }, error: function (jqXHR, textStatus, errorThrown) { if (textStatus == "error") { alert(textStatus + " : " + errorThrown); } else { alert(textStatus); } }, success: function (data, textStatus, jqXHR) { if (data == 'SUCCESS') { // 成功后跳到登录页 document.getElementById("login_hint").style.display = "block"; setTimeout(() => { window.location.href = '/static/view/signin.html'; }, 2000); } else { alert('signup fail!'); } } }); } </script> </html> 换成https后还是出现错误
03-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值