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