問題:
在關於JavaScript 閉包的討論中,一位朋友聲稱他們的實施缺乏封閉性,而另一個人則持相反的觀點。你能透過應用閉包的概念來確定哪個解決方案使用了閉包嗎?
解決方案:
閉包定義: JavaScript 中的閉包是指具有從不同作用域引用的自由變數(在父作用域中定義的變數)的函數子集。當閉包在其父作用域之外被引用時,它將關閉該作用域中的上值(自由變數)。
情況1:您朋友的程序
<code class="js">for (var i = 0; i < 10; i++) { (function f() { var i2 = i; setTimeout(function g() { console.log(i2); }, 1000); })(); }</code>
分析:
情況2:您的程式
<code class="js">for (var i = 0; i < 10; i++) { setTimeout((function f(i2) { return function g() { console.log(i2); }; })(i), 1000); }</code>
分析:
然而,函數 g 是一個閉包,因為它對變數 i2 進行閉包,而 i2 是綁定的到 f 的範圍。當從 setTimeout 中引用 g 時,它保留對 i2 的存取。
結論:您和您的朋友都在實作中使用閉包。不同之處在於,在你朋友的程式中,閉包是在內部函數 g 中創建的,而在你的程式中,閉包是在外部函數 f 中創建的。以上是你朋友的 JavaScript 程式碼實際上使用了閉包嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!