JS 函数的执行时机

133 阅读1分钟

1. 奇怪的现象

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

执行此代码时,得到的结果会是66666,而不是012345,原因是setTimeout是过一会再执行,所以for循环会先执行,当i=6时,跳出循环,此时setTimeout开始执行,可这个时候i的值已经为6了,所以执行6次打印,打印出来的结果也是6个6.

2. 打印012345的方法

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

使用let和for配合就可以打印出012345,原因是循环每次执行都会多创建一个i,复制当前i的值留在当前循环,不随i的值变化而变化,这个做法相当愚蠢,平白多创建了6个i。

3. 其他方法

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

使用立刻执行函数,也可以打出012345。这种方法不必为函数命名,避免了全局变量,而且立刻执行函数内部形成了单独的作用域。