es5的 var 和 es6 的 let 區(qū)別

科技 未結 4 1721

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 是區(qū)域作用域變量,所以每循環(huán)一次就是一個獨立的作用域,所以5個setTimeout里的i值是相互獨立的。

而es5的 var是根據(jù)函數(shù)范圍來區(qū)分作用域,循環(huán)的區(qū)域不是一個多帶帶的作用域,所以一直都是同一個i,當setTimeout開始執(zhí)行的時候,for循環(huán)已經(jīng)結束了,所以會打印5個6。
不知道我這樣理解對不對?

4條回答
  •  心雨微微藍2016
    2023-05-31 08:43

    理解的很對,var是以函數(shù)為作用域的,而let是以塊為作用域的(與大多數(shù)高級語言相同)。所以ES6的這些特性正說明js逐漸向傳統(tǒng)高級語言靠攏,提供嚴格明確的語言定義,便于開發(fā)大團隊協(xié)作和構建更大規(guī)模的應用。

提交回復