回撥函式 與 函式閉包

黃文文文文文文文文發表於2019-05-29

回撥函式

1.什麼是回撥函式?

作為引數的函式就是回撥函式!

例如:有兩個函式A,B如果函式A作為B的一個引數傳入B的話,那麼我們就稱A是回撥函式。

//宣告一個函式
function fn1(a){
    a()
}
//再宣告一個函式作為fn1函式的引數傳入
function fn2(){
    alert('我是一個回撥函式')
}
fn1(fn2)

例子中的fn2就被稱為一個回撥函式

2.回撥函式的用途

一般是某個行為或某件事之後的收尾處理,或者說對於不同行為結果,給出不同響應。 

閉包【返回一個函式的函式】 

1.為什麼會產生閉包

函式作用域中宣告的變數,在全域性作用域下是無法進行訪問的,但有時候我們又需要在全域性中去訪問函式內的變數,這個時候我們就需要用到閉包。

2.什麼是閉包

在函式A中,再定義一個函式a,用子函式a去控制父函式A中的變數,呼叫父函式A時,將子函式a返回給呼叫者,這就稱之為閉包。

//定義一個父函式
function A(){
    var i = 1
    //定義一個子函式輸出父函式中的變數i
    return  function a(){
        console.log(i)
    }
}
A()() //此處呼叫一次A函式返回的是一個函式a所以需要在呼叫一次,所以有兩次呼叫()

3.閉包的用途 

 1).可以讓父級作用域訪問到函式中的變數

2).可以讓這些變數的值始終保持在記憶體中

//宣告一個函式
function boss(){
    var n = 100
    //建立一個子函式,接收一個新的引數
    function child(newV){
    //對傳入的引數進行判斷,如果沒傳入新引數返回原來的n值,傳入則返回新值
        n = (newV == undefined) ? n : newV
        return n
    }
    return child
}
var myFun = boss()

 

4.閉包需要注意的事項

因為閉包會將這些變數一直儲存在記憶體中,這樣對記憶體消耗極大,影響網頁的效能,在IE中可能還會造成記憶體洩漏。

解決這個問題的方法:

如將當前變數的值設定為“null”,將變數的引用解除,當垃圾回收啟動時,會自動對這些值為“null”的變數回收。

相關文章