for (let i=1;i<=5;i++) { setTimeout(function(){console.log(i)},i*1000); }
这样就打印1,2,3,4,5
for (var i=1;i<=5;i++) { setTimeout(function(){console.log(i)},i*1000); }
这样就打印5个6。为什么呢?
我的理解,es6的 let 是区域作用域变量,所以每循环一次就是一个独立的作用域,所以5个setTimeout里的i值是相互独立的。
而es5的 var是根据函数范围来区分作用域,循环的区域不是一个单独的作用域,所以一直都是同一个i,当setTimeout开始执行的时候,for循环已经结束了,所以会打印5个6。
不知道我这样理解对不对?
理解的很对,var是以函数为作用域的,而let是以块为作用域的(与大多数高级语言相同)。所以ES6的这些特性正说明js逐渐向传统高级语言靠拢,提供严格明确的语言定义,便于开发大团队协作和构建更大规模的应用。
一周热门 更多>