iT邦幫忙

0

[JavaScript]認識 Closure(閉包)

前言

使用閉包時要注意:閉包雖然簡單易用,但也會造成佔用記憶體的問題。因為會讓函式執行完畢後,某些情況下,閉包的變數仍然無法釋放記憶體,所以使用閉包時還是要謹慎小心。

閉包簡短的定義

巢狀的function就可能會發生閉包,閉包就是用內層去使用外層的物件

來看一個閉包的例子

function foo(){
    let a =0;
    function run(){
        a++;
        return a
    }
    return run;
}
var f = foo();
console.log(f());

執行結果

f() //1
f() //2
f() //3

alt

上面程式碼的大意:

  • 我們來看函式foo定義了三件事:
  1. a = 0
  2. 定義函式run
  3. return 函式run
  • 而函式run定義了兩件事:
  1. a++
  2. return a

結果:每執行一次f(),a的結果就會加1

也就是closure發生了記憶體讓內層a的值,不會被釋放記憶

閉包本質上就是一個匿名函式

也因為程式碼只執行傳回函式

  • 對foo()而言,內層的function run()是函式run()
  • 對f而言,內層的函式function run()是一個匿名函式function(){}
    實際上,印出 f() 函式的範例中,建立了一個閉包(匿名函式),在執行傳回函式run時這個匿名函式只做a++和return a,且即使foo()已經執行完畢,a變數依然是存活在傳回的閉包範疇(記憶體)中。

重點

閉包將變數a本身關閉在自己的範疇(記憶體)中,而不是變數的值


尚未有邦友留言

立即登入留言