需要关于javascript函数和回调的解释

时间:2015-03-01 16:02:49

标签: javascript

即时学习javascript,我一直关注youtube上的一些视频教程

这是原始代码

function add(first, second, callback){
    console.log(first+second);
    callback();
}

function logDone(){
    console.log("done");
}

add(2,3,logDone);

以上代码的结果是

  

5   main.js(第4行)

     

完成   main.js(第9行)

我稍微改变了这个

的代码

function add(first, second, callback){
    console.log(first+second);
    callback;
}

function logDone(){
    console.log("done");
}

add(2,3,logDone());

结果就是这个

  

完成   main.js(第9行)

     

5   main.js(第4行)

我的问题是:

  1. 你能解释一下为什么我的结果堆积如此吗?

  2. 如果我们用括号()和没有括号()调用函数会有什么区别?

5 个答案:

答案 0 :(得分:8)

第一个代码段的说明

function add(first, second, callback) {
    console.log(first + second);
    callback(); // run whatever the "callback" function is
}

function logDone() {
    console.log("done");
}

add(2, 3, logDone); // pass in a function (not an invocation of a function) the
                    // function isn't run here

第二段摘要

的说明
function add(first, second, callback) {
    console.log(first + second);
    callback; // display the value of whatever "callback" is
}

function logDone() {
    console.log("done");
}

add(2, 3, logDone()); // run "logDone" and then pass the result (which in this
                      // case is undefined) into add

正如您所看到的,第一个代码段在callback函数中实际运行add,而第二个代码段在{{1}之前运行callback这样它就可以将从add返回的任何内容传递给logDone

答案 1 :(得分:4)

当我将logDone声明更改为此时,或许你会更清楚:

var logDone = function() {
    console.log("done");
}

标识符logDone基本上只是一个引用函数的变量。要执行(还有:调用,或:调用),请添加括号的函数:logDone()

所以,在你的第一个例子中,你只是将函数本身作为第三个参数传递给add(),然后在add()内执行,callback(); }。

然而,在您的第二个示例中,您立即执行函数logDone(),这导致返回值logDone() 1 作为add()调用的第三个参数传递。换句话说,执行第一个logDone(产生第一个日志消息),然后执行然后 add(产生第二个日志消息)。

此外,callback;内的add语句没有做任何事情。如果你像第一个例子一样离开括号,那么会导致错误,因为undefined 2 不是函数。


1)在这种情况下undefined,因为logDone()没有显式返回任何内容。

2)logDone()调用结果的值。

答案 2 :(得分:3)

  

如果我们用括号()和没有括号()调用函数会有什么区别?

如果你有(),那么你就打电话给它。如果你没有,那么你就不会。

  你可以向我解释为什么我的结果堆积如此吗?

在第一个示例中,您将函数传递给add,然后add函数将其调用。

在第二个示例中,您调用该函数并将其返回值(undefined)传递给add,然后在语句中提及它但不对其执行任何操作。

答案 3 :(得分:3)

执行func([args=optional])后,func正在调用调用

  

如果我们用括号()和函数调用函数会有什么区别   没有括号()?

只有当我们执行()(参数可选)时,我们调用函数。当函数没有括号时,您只需使用它的引用

通过存储引用在变量中执行一个函数,您可以稍后调用它,callback正在做什么。

在第二个片段中,由于没有返回任何内容,因此回调将具有undefined。尝试通过在第二个代码段中执行callback()来调用它,您应该看到错误说明,

  

undefined不是函数。

答案 4 :(得分:3)

在第一个示例中,您将函数作为参数传递 在第二个示例中,您将调用后的函数结果作为参数传递。