回調函數

前言

昨天看到了有關回調函數的問題,因爲以前沒學明白,致使遇到這個函數直接就懵了,昨晚潘老師講了好久,當時也是沒理解太多,後來本身細細理解了一下,在此作一個總結吧。函數

理解1.0

var map = function(callBack){
    callBack(6)
};

map((a) => {console.log(a)});

image.png
上述代碼的執行結果是6,其實回調函數的執行順序是這樣的,先來看一下下面這段代碼:spa

var map = function(callBack){
    console.log(callBack);
};

map((a) => {console.log(a)});

image.png
這段代碼的執行結果是 (a) => {console.log(a)},由於map方法接收的第一個參數爲一個函數,對於最下面這行代碼來講,它的參數只有一個,而且是一個函數,對應上面對它的定義,callBack是map方法要接收的第一個參數,那麼 callBack 就等於 (a) => {console.log(a)} ,callBack如今就是一個函數,他能夠接收一個參數,而後把這個參數打印出來,callBack(6),callBack方法此時接收的函數是6,那麼輸出結果天然就是6.code

理解2.0

假如map接收多個參數,想要輸出,那要怎樣實現呢,來看下面一段代碼:blog

var map = function(first,second){
    first('hello');
    second('world');
};

map((a) => {console.log(a);}, (b) => {console.log(b);});

輸出結果天然是
hello
world
對於多個參數來講,函數與函數之間要用 「 , 」 間隔,用以表示不一樣參數,調用原理同上。回調函數

理解3.0

對於下面這種參數裏面還有函數的又怎麼理解呢:it

var map = function (callBack){
    callBack((message)=>{
        console.log(message);
    });
};

map((b) => {b(6)});

上面的代碼執行後打印的值是6,來看一下爲啥吧:io

var map = function (callBack){
    callBack((message)=>{
        console.log(message);
    });
};

map((b) => {console.log(b)});

map在定義時接收到的第一個參數是一個函數表達式,下面接收到的第一個參數是b,那麼毋庸置疑,b就等於
(message)=>{console.log(message);}console


image.png


再看上面的b(6),b就是一段函數,它接收一個參數,並把它打印出來,那麼這個參數就是6,執行結果也就是6.function

理解4.0

對於更復雜的怎麼理解呢:class

var map = function(callback) {
    callback( function(messageSecond) {messageSecond('hello')} );
}
map( function callback(messageFirst) { messageFirst((abc) => console.log(abc));} );

咱們先來打印一下各自的值:

var map = function(callback) {
    callback( function(messageSecond) {
    console.log(2);
    console.log(messageSecond);
    messageSecond('hello')} );
}
map( function callback(messageFirst) {
     console.log(1);
     console.log(messageFirst);
 messageFirst((abc) => console.log(abc));} );

image.png
對於messageFirst來講,它是callBack裏面的內容,對於map的定義來講,裏面的內容是一個方法,那麼messageFirst就是裏面的方法,這個方法須要一個參數,這個參數也是一個方法,此時messageSecond是messageFirst的參數,也是一個方法,即(abc) => console.log(abc));
messageSecond('hello')就至關於給方法(abc) => console.log(abc));傳參爲'hello',而後打印出來。

總結

當時沒理解太清楚,就感受比較懵,當本身親自進行實踐,發現其實也還算好理解,好在終於搞明白回調函數啥意思了。