[英]how values are passed to callbacks in javascript
我想了解javascript引擎如何以及何時將值傳遞給回調函數,我已嘗試調試並在線查找但我無法找到確切的答案,請考慮以下示例:
for(var i = 0; i < 4; i++) {
console.log("outside callback " + i + " ");
setTimeout(function test(){
console.log("inside callback " + i + " ");
},100);
}
這打印出以下輸出
外部回調0
外部回調1
外線回調2
外線回調3
內部回調4
內部回調4
內部回調4
內部回調4
如果我只是使用let關鍵字更改i變量的聲明,如下所示:
for(let i = 0; i < 4; i++) {
console.log("outside callback " + i + " ");
setTimeout(function test(){
console.log("inside callback " + i + " ");
},100);
}
它產生以下輸出:
外部回調0
外部回調1
外線回調2
外線回調3
內部回調0
內部回調1
內部回調2
內部回調3
在Chrome中進行調試時,它在第一個示例中將i顯示為第二個示例中的測試函數和塊范圍的閉包范圍。
這涉及一個關於循環內部JavaScript閉包的常見問題- 簡單的實際示例 ,詳細說明為什么在循環中創建內部回調函數,使用var
聲明的變量具有循環結束時達到的值:雖然它們可能有設置回調時,保持不同的值, 異步執行回調,一段時間之后,循環已經很久完成,並且在循環中將變量保留在循環完成時保留的值。
從ECMAScript版本6開始,使用let
聲明的變量是塊作用域的,不能在定義它們的代碼塊之外訪問。 另外 , for
循環控制語句中定義的變量會得到特殊處理。
for
循環體,而不是包含for
循環的代碼塊。 為循環的每次迭代創建一個let
變量的新綁定。 這意味着每次迭代都可以擁有自己的一組變量值,這些變量值保存在為迭代創建的詞法環境記錄中,可以在閉包中使用,並由循環內定義的回調函數訪問。
每個詞法環境記錄中的循環計數器的值旨在使多個環境記錄的使用在很大程度上透明:
for( part1; part2; part3) { // loop body code }
let
for
語句中定義的變量具有執行part1
和part2
后它們將具有的值。 for
語句中執行part3
和part2
來確定的for
。 for
循環體內聲明的函數訪問在設置回調的迭代結束時保持的let
定義變量的值, 排除評估for
語句的part3
的副作用。 這實際上是因為使用let和var聲明的變量的范圍,而不僅僅是javascript的closure屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.