我的博客

javascript 的迷惑代码 -- let 和 var

目录
1
2
3
4
5
6
7
8
9
10
11
12
13
for (let i = 0; i < 3; i++) {
setTimeout(()=>{
console.log(i)
}, 1000);
}



for (var j = 0; j < 3; j++) {
setTimeout(()=>{
console.log(j)
}, 1000);
}

两段代码,除了变量名字外,唯一的不同是声明变量一个用的 let,一个用的 var。

第一个 console.log 输出的是 0、1、2。

第二个输出的则是三个 3。

因为第一个的 i 变量的作用域是 for 的 {} 之内,for 循环执行完了以后这个变量就不存在了,所以这个 i 是闭包的变量,保持了调用这个 setTimeout 的时候的 i 的值。

第二个的 j 使用 var 声明,作用域是全局的,所以 for 执行完了以后它的值仍然存在,所以输出的是 for 执行完成后的 j 的值。

另外 setTimeout 的作用是设定一个定时器,第一个参数是回调,第二个是延迟(单位为毫秒),JavaScript 是单线程执行的语言,完全没有并发,所有的指令都是顺序执行的,而且是依靠一个事件队列来管理(我这么理解),如果当前程序忙着,队列里的其他事情都顾不上做,只能依次排队。所以 JavaScript 适合做高并发的 IO 密集型任务,但是没法做 CPU 密集型任务。

如果上面的代码中,setTimeout 的第二个参数写成 0,结果也是一样的。因为程序忙着,即使定时器时间到了,也没法立即执行。

评论无需登录,可以匿名,欢迎评论!