2017-09-26 74 views
-3

我是JavaScript和編程新手,我已閱讀至少8或9個不同的示例/教程來解釋回調函數。從我所知道的情況來看,這是一個給新程序員帶來很多麻煩的概念。我明白爲什麼要使用它們,以及如何使用它們,但我仍然不確定我是否理解爲什麼他們工作。我寫了下面的例子:我該如何剖析這個JavaScript回調函數的例子?

function a(callback) { 
setTimeout(function() { 
    console.log("First"); 
    callback(); 
}, 2000); 
} 

function b(callback) { 
setTimeout(function() { 
    console.log("Second"); 
    callback(); 
}, 1000); 
} 

function c() { 
console.log("Third"); 
} 

function d() { 
a(function() { 
    b(function() { 
    c(); 
    }); 
}); 
} 

此代碼的工作作爲功能的運行,第一,儘管它需要的時間最長,函數B運行第二,即使它比C需要更長的時間。我知道我已經在函數a和b中插入了一個名爲'callback'的參數,並且這些函數將運行無論什麼時候運行它們的名稱,而是插入'callback'參數名稱的函數,如'callback );」線。例如,如果我在控制檯中鍵入a(b);,結果爲First,Second。如果我在控制檯中輸入b(c);,我會得到Second,Third。

我沒有真正理解的部分是我在函數d中編寫的,在這裏我運行了所有3個函數。函數d執行函數a,但在我看來,它包含一個匿名函數作爲參數,它運行函數b,它還包含一個匿名函數作爲參數,它運行函數c。這裏發生了什麼?爲什麼在控制檯中輸入a(b(c));不起作用?

我想我沒有真正看到函數d和函數a和b中的回調參數之間的鏈接。具體來說,當我做a(b);時,我很容易看到它是如何工作的。但是,當我做a(function() {b();}),產生相同的結果,我不是很理解它爲什麼工作。

有人會解釋函數d是如何工作的,或者爲什麼a(function() {b();})a(b);相同?

+0

因爲一個調用b調用c ..... – epascarello

回答

0

它是什麼,這裏發生的?爲什麼它不通過鍵入A(b工作(C ?));到控制檯

寫(b(C));這是一樣的:

a( b(c) );

這意味着你執行,但你運行B通過C作爲參數,這意味着在這之前:

b爲執行第一 b執行Ç 一個接收作爲參數的任何b正在返回並嘗試執行它,但由於b沒有返回任何東西,只要a嘗試執行不存在的東西,它就會給出錯誤「回調不是函數」,因爲undefined不是函數

我想我沒有真正看到函數d和函數a中的回調參數之間的鏈接和b。具體來說,當我做一個(b);我很容易看到它是如何工作的。但是,當我做一個(函數(){b();}),產生相同的結果,我不是真正理解它爲什麼工作。

總是看東西更劃分有用:

a(
    function() { 
    b(); 
    } 
) 

一個被執行,並作爲參數收到匿名函數 一個執行,作爲一個參數接收的功能(匿名一個) 匿名函數,那麼(只有這樣)執行b

有人可以剖析這對我和幫助我瞭解如何函數d的作品,或者爲什麼(函數(){b();})是相同的作爲一個(二);在這個例子中?

在(函數(){b();})函數中傳遞匿名函數到a,在這種情況下幾乎不會調用b但匿名函數可以包含更多的指令,像這樣:

a(
    function() { 
     console.log("I'm no longer the same!"); 
     b(); 
    } 
) 

所以,如果你想確保一個電話回來的東西比b,則你會(在這種情況下)可以使用匿名函數較多,但如果你只想通過a執行b,你會使用(b);

現在,考慮一下:

a(
    function(){} 
) 

它是相同的,但功能並不做任何事情

a(
    function(){ 
     console.log('anonymous'); 
    } 
) 

將打印匿名的,但是:

a(
    function(){ 
    console.log('anonymous'); 
    }() 
) 

會打印匿名,一秒鐘後會拋出一個錯誤(回調不是一個函數),因爲函數正在執行(注意()我加的),不返回任何東西,現在讓我們繼續前進的功能,並給它一個名稱(比方說,X):

function x(){ 
    console.log('anonymous'); 
} 

a(
    x() 
) 

,你可以看到,A(X())與(x)不同,不同之處在於,當你在一個函數前寫入()函數時,函數被執行,並且它的值是它返回的任何值,但是如果你不寫它(),它會是隻是對函數本身的引用。

1
a(function() { 
    b(function() { 
    c(); 
    }); 
}); 

這意味着 「執行功能,傳遞新的功能,誰的文字是:

function() { 
    b(function() { 
    c(); 
    }); 
} 

...」。所以它會生成函數,並調用一個。 a設置一個計時器,2秒鐘後,它調用你創建的函數。當執行功能,它發現該指令:

b(function() { 
    c(); 
}); 

這意味着「執行B功能,傳遞新的功能,誰的文字是:

function() { 
    c(); 
} 

...」。所以接下來就是這樣。 b被調用,它建立一個計時器,當b關閉時,它執行你傳遞給它的函數。作爲執行該功能的一部分,它調用c。

爲什麼不通過鍵入a(b(c));進入控制檯?

B(C)表示 「執行B功能,傳遞c函數」
A(B(C))的意思是 「執行的函數,傳遞在B(C)的返回值」因此,當(b(c))執行時,它立即運行b(c),因爲它需要知道它返回的是什麼。 b(c)設置一個計時器,然後立即返回undefined(這是隱含的,因爲沒有返回語句)。這個未定義的然後被傳入一個。a設置一個計時器並返回undefined。在大約1秒內,由b創建的計時器關閉,因此它調用c(這是傳入它的內容,大約在此之後1秒(從開始2秒),由a創建的計時器關閉。由於不確定的物通入,我想你會得到一個異常,因爲不確定是不是一個函數。

相關問題