JavaScript中的setTimeout()函数,以及let与var的某些区别
本文内容源于此
还有这里
setTimeout
setTimeout()函数类似于C语言中的sleep()函数,但又有所区别
setTimeout(),是使得 setTimeout()中的函数(即,前的内容)延迟发生(如下图代码即延迟2000ms,即2s)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<script>
setTimeout("alert('hello')",2000);
</script>
</head>
<body>
</body>
</html>
var与let
setTimeout()使用var在for中定义
因为var在此定义的作用域是在函数内 (这里的 i 是函数局部变量),每一次循环的 i 是同一个 i
又因为setTimeout()函数与其内部的函数是异步执行的,即setTimeout()执行时,内部的函数(下图中timer())也在执行,
for函数执行完毕,但1s还没到,此时等待执行的函数是
console.log(i) console.log(i) console.log(i) console.log(i) console.log(i)
因为每个循环的 i 是同一个,所以最终输出6 6 6 6 6
for (var i = 1; i <= 5; i++) {
setTimeout(function timer() {
debugger;
console.log(i); // 输出6 6 6 6 6
}, 1000);
}
setTimeout()使用let在for中定义
因为let在此定义的作用域是在函数的块内 (这里的 i 是函数局部变量),每一次循环的 i 是相互独立的,即本次循环与下次循环的i是无关的
又因为setTimeout()函数与其内部的函数是异步执行的,即setTimeout()执行时,内部的函数(下图中timer())也在执行,
for函数执行完毕,但1s还没到,此时等待执行的函数是
console.log(i) console.log(i) console.log(i) console.log(i) console.log(i)
因为每个循环的 i 是同一个,所以最终输出1 2 3 4 5
for (let i = 1; i <= 5; i++) {
setTimeout(function timer() {
debugger;
console.log(i); //输出 1 2 3 4 5
}, 1000);
}