JavaScript 閉包與匿名函數
匿名函數是 JavaScript 中常見的功能,經常出現在閉包的討論中。然而,並非所有匿名函數都有資格成為真正的閉包。
定義閉包
JavaScript 中的閉包是一種特殊類型的匿名函數,它保留對即使外部作用域結束後,它仍然被創建。此函數允許閉包從外部作用域「捕獲」變數的值,防止它們被垃圾收集。
案例研究:關閉變數
中在給定的程式碼範例中,兩種解都使用匿名函數來延遲計數器變數 i 的列印。
朋友的嘗試
第一個範例中的程式碼似乎捕捉了i 閉包內的變數。但是,它不滿足閉包的定義,因為內部匿名函數 g 不繼承外部函數 f 的詞法作用域。因此, i 實際上並不是「閉合」。
<code class="javascript">for(var i = 0; i < 10; i++) { (function(){ var i2 = i; setTimeout(function(){ console.log(i2); }, 1000) })(); }</code>
編輯的嘗試
第二個程式碼範例真正建立了一個閉包。外部函數 f 傳回的匿名函數會捕獲 i2 變數並將其值保留在閉包的詞法範圍內。然後在 setTimeout 回呼中呼叫這個閉包,確保存取 i 變數的原始值。
<code class="javascript">for(var i = 0; i < 10; i++) { setTimeout((function(i2){ return function() { console.log(i2); } })(i), 1000); }</code>
結論
在提供的程式碼中,編輯器的解決方案示範如何正確使用閉包來捕捉 i 變數的值。雖然這兩種方案都有效解決了延遲列印的問題,但只有小編的方案才算是技術意義上的閉包。
以上是JavaScript 中的匿名函數什麼時候會變成閉包?的詳細內容。更多資訊請關注PHP中文網其他相關文章!