首頁 >web前端 >js教程 >你朋友的 JavaScript 程式碼實際上使用了閉包嗎?

你朋友的 JavaScript 程式碼實際上使用了閉包嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-01 06:11:02537瀏覽

Is Your Friend's JavaScript Code Actually Using Closures?

JavaScript 閉包與匿名函數

問題:

在關於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>

分析:

  • 函數f不是閉包,因為所有自由變數(i、setTimeout和console)都綁定到全域作用域,並且沒有一個是閉包的
  • 然而,函數g 是一個閉包,因為它封閉了變數i2,而變數i2 綁定到f 的範圍。當在 setTimeout 中引用 g 時,它保留對 i2 的存取。

情況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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn