JS 函数的执行时机

90 阅读1分钟

1、解释如下代码为什么会打印 6 个 6

let i = 0
for(i = 0; i<6; i++){
	setTimeout(()=>{
		console.log(i)
		},0)
}

JS函数分为同步和异步两种情况,这里简单说以下两者的区别:

(1) 同步函数:根据函数的调用顺序依次执行,后面的代码始终是在前面的代码执行完毕的基础上才开始执行。

(2) 异步函数:异步函数被调用时,如setTimeout,ajax等异步函数会交由指定的模块处理,不影响同步函数的执行,在异步函数达到触发条件,比如setTimeout的定时器到时或者ajax请求得到了返回,那么会把相应的回调函数压入指定队伍列中,等到主线程的任务队列为空时,再依次取出异步函数的回调进行执行。

对以上代码的解释是:在for循环中调用setTimeout对i进行打印,尽管定时器的时间为0,但是由于setTimeout的异步函数,会等到所在环境中的其他代码执行完毕以后再执行回调,也就是等到for循环完毕,i的值为6时,开始对6次循环中的定时器回调函数一次执行,所以打印结果为6个6;

2、写出让上面代码打印 0、1、2、3、4、5 的方法

for(let i = 0; i<6; i++){
	setTimeout(()=>{
		console.log(i)
	},0)
}

3、除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5

let i=0
for(i=0;i<6;i++){
	!function (i){
		setTimeout(()=>{
			console.log(i)
		},0)
	}(i)
}