如何理解 JavaScript 定時器機制

時間 2021-05-31 00:22:17

1樓:倪凡

首先我們需要了解下的event loop。JS是單執行緒的也就意味著它每一次只能執行乙個任務,而任務分為同步和非同步,for迴圈屬於同步任務,而定時器屬於非同步。

var宣告,沒有影響到程式的執行機制所以邏輯是:先執行完for迴圈,JS再去它的非同步佇列中去執行定時器,而這時i早已加滿。

let宣告,會在每次for迴圈都新建立乙個新的作用域,這樣定時器在分別在每個作用域裡,i就依次輸出

2樓:

對於var i,最終列印輸出的變數指向i本身。

對於let i,迴圈中每次都會拷貝出乙個新的i,最終列印輸出指向對應迴圈中拷貝出來的i。

3樓:

引用從 https://

中看到的一句話:

There is another great advantage using let as it creates a new lexical environment and also binds fresh value rather than keeping an old reference.

我以為這句話是本題最適合的回答。

4樓:

如果你關心的是為什麼兩個迴圈的結果不一樣,那麼這個題跟定時器關係就沒那麼大,主要考察的是閉包,還有let和var的區別

檢視[文件](let)我們直到,let語句定義的是塊級作用域本地變數(Theletstatement declares a block scope local variable)

檢視[文件](Closures)我們知道,閉包是指函式與函式定義處詞法環境的組合(Aclosureis the combination of a function bundled together (enclosed) with references to its surrounding state (thelexical environment). )

第乙個例子中,由於宣告變數使用的是var,因此函式定義處的詞法環境通俗的講是for迴圈之外的環境,迴圈了4次,但只有乙個詞法環境,裡面只有乙個不斷被改寫的變數i

第二個例子中,使用的是let宣告,函式定義處的詞法環境是for的迴圈體,迴圈了4次,有四個詞法環境,每個裡面都有不同的i。

5樓:troy351

let是塊級作用域,也就是每次迴圈的i不是同乙個i,自然可以輸出各自的i。

var是函式作用域,每次迴圈的是同乙個i,所以輸出的是相同的i

如何理解 Javascript 中的 Promise 物件的狀態不受外界影響?

胡小濺 你說反了,Promise 的狀態就是靠外界修改的。它自己並不會自發地從 Pending 變成 Resolved,它只是將可以改變內部狀態的 resolve 和 reject 方法暴露出來,由使用者決定什麼時候改變狀態。唯一的限制是狀態只能改變一次,一旦從 Pending 變為其它狀態就不再受...

用javascript執行上下文怎麼理解這個問題?

當你的a,b函式宣告時會為其建立乙個隱藏屬性 scope 這個屬性包括當前作用域可以訪問到的變數集合,在你這個例子裡面就是global object。當a,b函式執行時會為其建立乙個execution context執行時上下文,這個執行時上下文裡面有乙個scope chain作用域鏈,作用域鏈是乙...

如何理解定積分的換元法?

鼠鼠國王 可以理解為,對座標軸的一種變換。其中,換的元應滿足 單調可導且導數連續 這一點在同濟教材上的體現並不清晰,例題會直接換元,而不做變數取值限制 在剛剛引入定積分時,會把定積分稱為 面積 此時就應該考慮乙個問題 面積的單位是什麼。它是標準正交基描述下的 面積 把軸的單位長度作乙個拉伸的變化,但...