2014-11-06 216 views
0

中,我有以下代碼:放置一個函數作爲參數另一個函數

var doSomething = function(paramOne, paramTwo, fn){ 
    paramOne = paramOne + 3; 
    paramOne = paramOne + 1; 
    paramOne = paramOne * 8; 

    return fn(paramOne, paramTwo); 
}; 

function sum(paramOne, paramTwo){ 
    return paramOne + paramTwo; 
}; 

var foo = doSomething(2, 2, sum); 

alert(foo); 

此代碼我是從學源來了...所以它工作正常。

我明白髮生了什麼事..但我希望有人能解釋它嗎?

我不理解這麼好部分是爲什麼paramOne和paramTwo在這兩行括號:

return fn(paramOne, paramTwo); 

function sum(paramOne, paramTwo){ 

如果有人可以解釋這對我來說會非常感謝。

謝謝。

回答

1

您似乎會感到困惑,因爲paramOneparamTwo在不同的環境下使用。

這也許會更清晰:

var doSomething = function(paramOne, paramTwo, fn){ 
    paramOne = paramOne + 3; 
    paramOne = paramOne + 1; 
    paramOne = paramOne * 8; 

    return fn(paramOne, paramTwo); // since `sum` is the function being passed in 
            // below, the result here is the same as calling 
            // sum(paramOne, paramTwo) 
}; 

function sum(firstNumber, secondNumber){ 
    return firstNumber + secondNumber; 
}; 

var foo = doSomething(2, 2, sum); 

alert(foo); 

正如你可以在這裏看到,該sum函數的參數是doSomething完全無關的人。您必須將值傳遞到sum()以賦予其值以加在一起並返回。

現在更有意義嗎?

+0

謝謝JLRishe,這更清楚一點......我很困惑,所有的參數都是一樣的。因此,通過說'return fn(paramOne,paramTwo);'..給'firstNumber'的值'paramOne'和'secondNumber'的值'paramTwo'?否則,我很困惑,在哪裏定義了「firstNumber」和「secondNumber」。再次感謝! – Forrest 2014-11-06 23:45:55

+0

@Forrest是的,我會說你的解釋是正確的。 – JLRishe 2014-11-07 00:58:37

0

這條線的位置:return fn(paramOne, paramTwo);由兩個部分組成:return expression和表達本身,這是一個功能fn調用使用兩個參數paramOneparamTwo

此行:function sum(paramOne, paramTwo){是功能sum的定義。


爲了更好地解釋它,我們應該從這一行開始:var foo = doSomething(2, 2, sum);。在這一行中,我們調用一個函數doSomething並將三個參數傳遞給它。前兩個參數是兩個整數值:22,最後一個參數是一個函數sum。在JavaScript中,您可以通過在調用中指定其名稱來將函數作爲參數傳遞給另一個函數。

當函數doSomething被實際調用時,所有傳遞的參數都被綁定到局部變量,在函數的定義中指定:function(paramOne, paramTwo, fn)。因此2將變爲paramOne,其他2將變爲paramTwosum將變爲fn

當我們稍後調用fn()時,我們實際上正在調用sum()

sum函數在這裏是相當自我解釋。

如果您有其他問題,只需在評論中詢問他們這個答案。我會很樂意更新我的答案。

+0

非常感謝Slava。我不明白的是爲什麼'fn()'和'sum()'包含相同的參數?爲什麼不能簡單地使用'return fn();'而不是'return fn(paramOne,paramTwo);'。簡單地說,如果真正被調用的函數是sum(),那麼它已經包含了參數? – Forrest 2014-11-06 23:00:39

+0

@Forrest:它有參數聲明,是的,但在*調用*你需要*傳遞參數值。 – Bergi 2014-11-06 23:11:27

相關問題