71、for循环中引用setTimeout问题

1、问题:

  1. setTimeout是异步执行,即使setTimeout中的等待时间为0也不会立刻执行
  2. for循环代码是同步,所以要等待for循环执行完以后才会执行setTimeout

setTimeout运行机制的问题:定时函数被加入执行队列,等主程序运行完毕时,此时再调用定时函数,i的值已经变为4,四次的定时函数都会共用i=4这个值。

for(var i=0; i<4;i++){
	setTimeout(function(){
		console.log(i);
	},100)
}
// 打印结果:4 4 4 4

2、解决:

(1)let

for循环头部的let不仅将i绑定到for循环中,它还将i重新绑定到循环体的每一次迭代中,确保上一次迭代结束的值重新被赋值。通过let声明块变量i,能作用于这个块。利用了let的块级作用域。

for(let i=0; i<4;i++){
	setTimeout(function(){
		console.log(i);
	},100)
}
// 打印结果:0 1 2 3

(2)拆分结构

将setTimeout进行封装,此时定时函数的变量作用域就变为f函数代码块内每次for循环传给定时器的i值都会变为定时函数的私有变量值,这样就达到了预期目的。

for(var i=0; i<4;i++){
	f(i);
}
var f = function(i){
	setTimeout(function(){
		console.log(i);
	},100)
}
// 打印结果:0 1 2 3

(3)闭包

通过闭包,将i的变量驻留在内存中当输出j时,引用的是外部函数的变量值ii的值是根据循环来的执行setTimeout时已经确定了里面的的输出了。

	for (var i = 0; i < 4; i++) {
		(function (j) {
			setTimeout(function () {
				console.log(j);
			}, 100)
		})(i);
	}
	// 打印结果:0 1 2 3

(4)setTimeout第三个参数(可能解决不了)

由于每次传入的参数是从for循环里面取到的值,所以会依次输出

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue,可以通过使用`setTimeout`函数来实现循环延迟执行。其,可以使用异步方法、线程和进程等不同的方式来实现延迟执行。 一种常见的方式是使用`setTimeout`函数结合异步方法来延迟执行。例如,可以使用一个`for`循环结合`setTimeout`函数来实现循环延迟执行。代码如下所示: ```javascript for (let i = 0; i < list.length; i++) { (function(a) { setTimeout(() => { console.log(list[a]); }, 1000 * i); })(i); } ``` 这段代码,使用了一个立即执行函数来创建一个闭包,将`i`的值保存在闭包,从而在每次循环迭代都能正确地获取到`i`的值,并且通过`setTimeout`函数来延迟执行`console.log`语句。 另一种方式是使用`forEach`方法结合`setTimeout`函数来实现循环延迟执行。代码如下所示: ```javascript list.forEach((obj, index) => { setTimeout(() => { console.log(obj); }, 1000 * (index + 1)); }); ``` 这段代码,使用了`forEach`方法来循环遍历`list`数组,并且在每次遍历时都使用`setTimeout`函数来延迟执行`console.log`语句。通过传入的`index`参数和定时器的延迟时间,可以实现逐个延迟执行的效果。 综上所述,通过使用`setTimeout`函数结合异步方法或`forEach`方法,可以在Vue实现循环延迟执行的效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [浏览器事件循环与vue nextTicket的实现](https://download.csdn.net/download/weixin_38592332/13624272)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vue循环for里使用延时](https://blog.csdn.net/wwm_wang_wen/article/details/125545182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值