2017-09-28 73 views
0

我想清楚瞭解javascript中的回調函數,以下是我的兩個問題,這些問題可能很基本,但我想這有助於澄清回調的概念:Javascript回調如何處理不同?

1.做所有回調函數異步執行,這意味着即使任務不是很慢,它們在單獨的進程上運行,然後放回到事件隊列中以便稍後執行?

2.在我的示例代碼中,有3個函數,一個簡單的2個數字的加法函數,一個調用add函數的普通函數和一個使用回調函數的函數,結果將在控制檯中相同現在,除了速記和匿名函數的優點之外,calculate()和calculate1()在執行過程中有何不同。

同時,我通過線程去 Why use callback in JavaScript, what are its advantages?其中解釋了爲什麼我們需要回調專爲異步編程,但我想知道所有的 如何回調簡單的或複合的處理,在我的代碼下面,我我使用簡單的回調函數並不是像setTimeOut或setInterval這樣的異步函數,它只是一個回調函數,那麼它將如何處理或執行的方式會有所不同。 謝謝!

function add(x,y){ 
    return x + y; 
} 
function calculate(x,y,compute){  
    return compute(x,y); 
} 
function calculate1(x,y){ 
return add(x,y); 
} 
var a = calculate(5,4,function(x,y){return add(x,y)}); 
var b= calculate(5,4,add); 
var c= calculate1(5,4); 

console.log(a); 
console.log(b); 
console.log(c); 

回答

1

是否所有的回調函數執行異步[...]

是否異步處理回調取決於接受回調的函數何時調用它們。你可以說你的calculate函數同步調用它的回調函數。下一行評估之前執行,你傳遞給calculate匿名函數,就像下面的代碼片段:

function callCallback (cb) { 
 
    cb(); 
 
} 
 

 
callCallback(function() { 
 
    console.log('A'); // called first 
 
}); 
 

 
console.log('B'); // called second

正如你所看到的,儘管採取了回調函數, callCallback「阻止」執行。

實際上,作爲參數傳遞函數與其他函數無關,與異步無關。但是,這在處理異步任務時很方便且經常使用。

這應該回答你的第一個問題。第二個問題有點不清楚。

有,當然,不禁止代碼執行後,它們的功能:

function callCallback (cb) { 
 
    setTimeout(cb, 10); 
 
} 
 

 
callCallback(function() { 
 
    console.log('A'); // called second 
 
}); 
 

 
console.log('B'); // called first

這就是差別,你似乎已經明白。

+0

感謝您的解釋和我的第一個問題的答案是清楚的,回調沒有必要與 異步的事情,但關於我的第二個問題,我會嘗試進一步解釋。假設我把你的編碼片段,你叫settimeout in callCallback並刪除參數 中的回調cb並重寫setTimeout(function(){console.log('A'),10}並調用callCallback()而不使用匿名函數,儘管ouptput將相同,它會對javascript的處理方式產生任何影響嗎? –

+0

不,在內部,它沒有任何區別。在這兩種情況下,都會將函數引用傳遞給'setTimeout',就是這樣。 – PeterMader

0

1.是否所有的回調函數都是異步執行的,這意味着即使任務不是很慢,它們在一個單獨的進程上運行,然後放回到事件隊列中以便稍後執行?

如果沒有攔截JavaScript方法,則立即執行回調。

2.In下面我的示例代碼,有3個功能,2號的簡單的附加功能,它調用該加載功能並且使用回調函數的功能的正常功能,結果將是相同的在控制檯中,除了速記和匿名函數的優點外,現在calculate()和calculate1()在執行過程中有何不同。

他們幾乎相同,但有一些基本的區別。

1)一是純度計算純而計算1不純。 基本上計算只與它傳遞的值一起工作,這使得它可以預測。

function calculate(x,y,compute){  
    return compute(x,y); 
} 

這裏所有的x,y,計算都在自己範圍內自足。它不需要擔心範圍之外的內容。

但另一方面,calculate1假定在某處會有add函數,而我們並沒有控制它是如何或者是什麼。

function calculate1(x,y){ 
return add(x,y); 
} 

在這裏,我們不知道什麼補充的是,所以當計算被稱爲它試圖找到什麼是添加外it.This就是爲什麼在函數式編程回調是必須的。

2)另一個主要區別是這個裏面的回調,你的例子中沒有顯示。

當使用回調與是一個大難題。所以如果你想掌握回調,我會建議你仔細觀察一下。 this link有一個最好的解釋這個裏面的回調。我強烈建議通過它。