2016-02-12 28 views
2

我对下面的代码有点困惑。我不明白的部分是结果参数如何等于callback(x+y)的结果。有人可以解释这一点,也许这是执行步骤的顺序?了解具有参数的回调

function add(x,y, callback){ 
    callback(x+y) 
} 

add(3,4, function(result){ 
    console.log(result) //logs out 7 
}) 

我知道3 + 4是7,但我没有明确理解结果参数如何获得这个7值。

+1

这是一个函数参数,就像任何其他函数参数一样。将'3'作为'x'并没有什么不同。 – SLaks

回答

1

大问题,一旦你明白这一点,它会在打开很多门的JavaScript。

让我们看不回调会发生什么:

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

add(1, 2) // returns 3 

当你return x + y,那就是你从功能回来。

现在我们来介绍一个新功能,但不是回调。

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

function logResult(result) { 
    console.log(result) 
} 

var result = add(1, 2) // 3 
logResult(result) // outputs "3" 

正如你看到的,我们称之为add,得到的结果,然后将其传递到logResult,它输出到控制台。

如果我们在add第三个参数传递logResult作为一个函数,然后我们与result调用它里面add,它有效地是同样的事情!

function add(x, y, callback) { 
    var result = x + y; 

    // we're calling the function that gets passed in 
    // which is `logResult` 
    callback(result) 
} 

function logResult(result) { 
    console.log(result) 
} 

add(x, y, logResult) // outputs "3" 

现在我们转回到你的榜样,从而降低了一切所需的最少代码:

function add(x, y, cb) { 
    cb(x + y); 
} 

add(1, 2, function (result) { 
    console.log(result) 
}); // outputs "3" 

在JS你可以通过功能集成到其它功能。接收另一个函数作为参数的函数可以调用它。这就是你在这里。您还可以进一步减少这样的:

function add(x, y, cb) { 
    cb(x + y) 
} 

add(1, 2, console.log) // outputs "3" 
add(1, 2, console.error) // outputs "3" in error format 
+1

而当你告诉他一个函数可以返回一个函数时,他的脑袋就会崩溃! :) –

+1

谢谢你的伟大的解释。现在我知道更多! – user1142130

0

add函数调用这些参数:

x = 3 
y = 4 
callback = function(result) { console.log(result) } 

该函数总结x+y。这产生7

然后调用callback功能有这样的说法:

result = 7 

这个函数日志7在控制台

0

此代码:

function add(x,y, callback){ 
    callback(x+y) 
} 

add(3,4, function(result){ 
    console.log(result) //logs out 7 
}) 

是完全一样的:

function add(x,y, callback){ 
    callback(x+y); 
} 

function output(result){ 
    console.log(result); 
} 

add(3,4, output); 

因此函数添加需要3个参数,调用add(3,4,output)时,

  1. 的参数x被分配的参数y被赋值为4
  2. 参数callback被分配的指针功能output

由于在上面的呼叫callback3

  • 是一个指针,指向功能output,当你做callback(x+y)你实际上是拨打output(3+4)

    没什么特别的。这只是javascript处理函数作为第一类值的结果。