let和var在for迴圈中的不同表現

2022-03-06 12:07:58 字數 1123 閱讀 4775

var只有函式作用域,沒有塊級作用域

//

函式作用域的表現

function

test()

test();

//10

console.log(i); //

i is not defined;

//塊級作用域對var沒有約束

console.log(i);

//10

從上面的**可了解到,塊級作用域對var是沒有約束作用的。

let與var不同,let是有塊級作用域的。

//

塊級作用域對let宣告的變數有約束

console.log(i)

//referenceerror

//

var宣告i

function

test(),0);

}}test();

//輸出結果:2、2

//let宣告i

function

test(),0);

}}test();

//輸出結果:0、1

可以看到只是宣告方式不一樣,輸出的結果卻有很大的差異。

settimeout()是以非同步的方式執行的。在執行for迴圈的時候,並不是執行一次for迴圈就立刻執行一次settimeout(),而會讓settimeout()進入另一條執行緒進行等待,當主線程(這裡就是test())執行完後,settimeout()再依次執行。

因為var是沒有塊級作用域的,所以在for迴圈中宣告的i會存在於test()函式作用域中。每一次for迴圈就會宣告一次i,但後面宣告的變數會覆蓋前面宣告的變數。所以當for迴圈執行完後(此時settimeout()還未被執行),函式作用域中的i的值就變成2了

而settimeout()所在的執行緒中是這樣的:

//

第一次進棧

settimeout(()=>);

//第二次進棧

settimeout(()=>);

這裡的i都指向函式作用域中的i。所以輸出都為2。

);    

});

}

所以會一次輸出0,1;

for迴圈中let和var的區別

先看2段 使用var宣告,得到3個3 var a for var i 0 i 3 i a 0 3a 1 3a 2 3 使用let宣告,得到0,1,2 var a for let i 0 i 3 i a 0 0a 1 1a 2 2這是為什麼呢?首先要知道var 宣告作用域是函式作用域,let宣告的作用...

for迴圈中let和var的區別

對呀初學j ascript的同學來說,變數提公升永遠都是過不去的坎,相信我們都遇到過這種情況,看下面 var var arr for var i 0 i 10 i arr 2 輸出為10變數i是var命令宣告的,在全域性範圍內都有效,所以全域性只有乙個變數i。每一次迴圈,變數i的值都會發生改變,而迴...

for迴圈中的var和let的區別

for var i 0 i 3 i 30 100 console.log i 先輸出 0 1 2 1 這道題涉及到了非同步 作用域 閉包 settimeout是非同步執行,10ms後往任務佇列裡面新增乙個任務,只有主線上的全部執行完,才會執行任務佇列裡的任務,當主線執行完成後,i是3,所以此時再去執...