关于js中setTimeout循环遇到的问题

第一种var声明变量

for(var i=0;i<10;i++){
    
    
	setTimeout(()=>{
    
    
		console.log(i)
	},0)
}
//输出结果:10个10

由于JavaScript是单线程的,按顺序执行,setTimeout是异步函数,它会将 内部函数放到任务队列中,而此时会先将循环执行完毕再执行 内部函数,因此当执行 内部函数时 i 已经等于10了,所以最终会输出10个10

第二种let声明变量

for(let i=0;i<10;i++){
    
    
	setTimeout(()=>{
    
    
		console.log(i)
	},1000)
}
//输出结果:0-9

let块级作用域,for循环外无法获取i,因为for循环头部的let将其重新绑定到循环体的每一次迭代中,确保上一次迭代结束的值重新被赋值。
setTimeout里面的function()属于一个新的作用域,通过var定义的变量是无法传入到这个函数执行域中的,通过使用let来声明块变量能作用于这个块,所以function就能使用i这个变量了;

猜你喜欢

转载自blog.csdn.net/qq_47272950/article/details/124693116