for(var i=0 ; i<3 ; i++){
console.log(i);
}
//输出:0 1 2
//解析:同步代码顺序执行
for( var i=0 ;i<3 ;i++){
settimeout(console.log(i),0);
}
//输出: 3 3 3
//解析:var定义的自变量只有全局作用域和函数作用域。for循环导致的i自增是在同步队列中的,settimeout是异步队列中的宏任务。先执行同步队列,再执行异步任务。当第一个settimeout开始执行时,i已经自增到3了,settimeout中的i是全局的i,所以输出3 3 3.
for( let i=0; i<3 ; i++ ){
settimeout( console.log(i),0)
};
//输出:3 3 3
//js运行内部原理:
{ let i = 0
{i = 0 ; settimeout( console.log(i),0)};
{i++ ; settimeout( console.log(i),0)};
{i++ ; settimeout( console.log(i),0)};
}
//解析:let有块级作用域
for( const i=0; i<3 ; i++ ){
settimeout( console.log(i),0)
};
//输出:3 3 3
//js运行内部原理:
{ const i = 0
{i = 0 ; settimeout( console.log(i),0)};
{i++ ; settimeout( console.log(i),0)};
{i++ ; settimeout( console.log(i),0)};
}
//解析:const有块级作用域 但定义的是定量 无法++ 导致报错