JavaScript 閉包已成為一些開發人員感到困惑的主題。雖然所有 JavaScript 函數都是閉包,但特定的子集具有特殊的理論意義。本文旨在闡明概念並確定兩個程式碼區塊中哪一個準確地利用了閉包。
理解閉包:
閉包是一個捕獲並維護對閉包的存取的函數。來自其封閉範圍的變量,即使該範圍不再處於活動狀態之後也是如此。本質上,閉包是一個具有記憶體並可以從其父作用域存取資料的函數,稱為「父作用域變數」或「上值」。
辨識閉包:
要確定一個函數是否是一個閉包,我們必須檢查它的變數。沒有非局部變數(即自由變數)的函數不能是閉包。具有非局部變數的函數必須從其父作用域外部引用才能成為閉包。
情況 1:朋友的程式
<code class="javascript">for(var i = 0; i < 10; i++) { (function(){ var i2 = i; setTimeout(function(){ console.log(i2); }, 1000) })(); }</code>
在這種情況下,函數缺少任何封閉的父作用域變量,因此不是閉包。然而,傳遞給 setTimeout 的內部函數是一個閉包,因為它捕獲並維護對自由變數 i2 的存取。
案例2:作者的程式
<code class="javascript">for(var i = 0; i < 10; i++) { setTimeout((function(i2){ return function() { console.log(i2); } })(i), 1000); }</code>
這裡,內部函數保持對自由變數i2 的訪問,並且即使在其父作用域之外引用時也保持閉包。
結論:
在這兩種情況下,都使用了閉包。作者的程式使用閉包來正確捕捉 i 的值。透過傳回另一個函數並將其傳遞給setTimeout,內部函數可以存取封閉變數i2。這可確保在延遲後將正確的值列印到控制台。
以上是JavaScript 中的匿名函數總是閉包嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!