2012-02-29 65 views
5

例如,這兩個實際上是一樣的嗎?是「返回」;在Node.JS中使用回調時必要/有用嗎?

someFunction(val, callback){ 
    callback(val); 
}; 

someFunction(val, callback){ 
    callback(val); 
    return; // necessary? 
}; 
+1

請注意,您不能使用名稱「var」作爲函數參數名稱,因爲「var」是一個關鍵字(它聲明變量)!你應該修改你的問題,並將「var」更改爲「val」或其他內容,以避免在答案中挑選nit =) – maerics 2012-02-29 23:18:07

+0

Thanks - changed! – randylubin 2012-03-01 00:14:55

回答

5

是的,它們是一樣的。如果你的函數沒有返回值,那麼你可以省略return語句或者沒有參數使用它;在這兩種情況下,對函數的調用都返回「undefined」。

function f1(){}; 
typeof(f1()); // => "undefined" 

function f2(){return;}; 
typeof(f2()); // => "undefined" 
1

在一般的JavaScript意義上說,是的,他們是相同的 - 我不明白爲什麼node.js的會有什麼不同。

在這兩種情況下,someFunction()的返回值將爲undefined。函數內是否有回調是無關緊要的。

1

旁邊的事實,你不能有一個名爲形參var你的兩個片段是相同的,並且工作方式相同。如果未指定,ECMA腳本中的每個function默認返回undefined

0

它們是相同的;你應該而不是使用return,因爲把它放在那裏會讓讀者感到困惑,因爲它是不必要的。

旁註:在某些語言(但可能不是JavaScript)的返回語句可能會如果尾調用優化啓用甚至沒有被執行(即,它是合理的編譯器從堆棧中刪除的功能,一旦你離開它,如果你從未打算做其他事情)。再一次,在標準JavaScript的任何實現中可能都不相關。

+0

不是真的 - 控制流將通過回調函數並返回到封閉函數(除非拋出異常),直到它到達「return」語句並退出該函數。所以聲明是可達的(即它不是死代碼),它只是沒有做任何事情! – maerics 2012-02-29 23:42:28

+0

@maerics:哎呀抱歉,我最近在做高級回調編程。控制是否返回到這個函數取決於語言語義是否允許使用語言堆棧的尾部優化。我懷疑這是與JavaScript的情況,所以謝謝你,我會編輯我的答案。 – ninjagecko 2012-03-01 00:00:55

+0

啊,有趣的想法。無論如何,是的,AFAIK,ECMAScript不需要尾部呼叫消除,我不認爲任何口譯人員都這樣做。 – maerics 2012-03-01 00:07:08

7

雖然他們都是一樣的,你會看到類似下面不時:

someFunction(val, callback){ 
    if (typeof val != 'object') 
    return callback(new Error('val must be an object')); 
    callback(null, val); 
}; 

換句話說,回報是早期用來「破發」出來的功能。大多數情況下,我已經看到那些用於條件的東西;您測試錯誤條件(如果出現錯誤,則儘早返回回調),然後避免將函數的其餘部分包含在else子句中。

相關問題