再次認識閉包

2021-09-28 11:53:05 字數 1120 閱讀 7789

1)官方一點說,能夠讀取其他函式內部的區域性變數的函式,即為閉包。

抓住幾個點:

2)從表現上來認識: 乙個函式a裡定義了另乙個函式b,b讀取了a的區域性變數

3)從特性上去認識:函式內定義的區域性變數,會隨著函式的執行完畢而被銷毀,記憶體被**。但是在閉包存在的情況下,區域性變數被閉包函式引用,因此沒有被立即銷毀,還能被訪問到,直到閉包不被引用,才**記憶體。

function example() 

}var test = example();

test();

// 等於null取消對閉包的引用

test = null;

說白了,就是在js裡,變數分為全域性變數和區域性變數兩種,一般情況下全域性變數在記憶體中常駐,區域性變數常在於函式內,執行完畢就會被**了。而閉包,能讓區域性變數常駐與記憶體,宛如全域性變數,但作用域並沒有全域性變數那麼「寬」,其他外部**不能訪問,僅閉包函式自身能訪問。

我把它理解成「被隔離起來的全域性變數」。

用於定義私有變數和私有方法,如使用「模組模式」,不額外生產全域性變數/方法,不汙染全域性環境。

在記憶體中維持乙個變數,如可利用一套**能建立出多套作用域環境下的同名變數。

function person(name) 

}var dad = person('dad');

var mom = person('mom');

dad(); // dad

mom(); // mom

由於記憶體不被**,容易造成大量記憶體使用,閉包使用不當會造成記憶體寫漏

影響瀏覽器效能,處理速度等

上面在特性上說了,區域性變數直到閉包函式不被引用,才會被**。這個很重要,如果你僅定義了閉包函式,卻不讓外界環境引用(如沒有return出去),則定義完畢之後就會被**了,實際上並沒有發揮到閉包的真正作用

// 這種情況下,`name`會被**掉。

function example()

}// 這種情況下,`name`不會被**掉。

function example()

}var a = example();

重新認識閉包

閉包這個概念作為前端來說算是耳熟能詳了,基本是面試的時候必問的問題,基本上隨便找個前端都能說出點什麼。閉包指的是 能夠訪問另乙個函式作用域的變數的函式。清晰的講 閉包就是乙個函式,這個函式能夠訪問其他函式的作用域中的變數例如下面這個例子eg1 function a return c 複製 通常我們面...

對JS閉包的認識

涉及面試題 什麼是閉包?經典面試題,迴圈中使用閉包解決var定義函式的問題 for var i 1 i 5 i i 1000 首先因為 settimeout 是個非同步函式,所以會先把迴圈全部執行完畢,這時候 i 就是 6 了,所以會輸出一堆 6。解決辦法有三種,第一種是使用閉包的方式 for va...

關於閉包的幾點認識

什麼是閉包?閉包一般人都說,是函式中定義的乙個函式,有的人也說函式中套函式。其實準確點說,閉包是乙個能夠訪問到其他函式內部變數的函式,當然這個其他函式不是父子關係的函式,而是兄弟關係的函式。舉個最簡單的例子引導一下 function alwayslinger console.log num num ...