2014-11-06 67 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

相关问题