Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要关于javascript函数和回调的解释吗_Javascript - Fatal编程技术网

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

需要关于javascript函数和回调的解释吗,javascript,Javascript,我正在学习javascript,我一直在关注youtube上的一些视频教程 这是原始代码 函数添加(第一、第二、回调){ console.log(第一个+第二个); 回调(); } 函数logDone(){ 控制台日志(“完成”); } 添加(2,3,logDone) 如果调用带括号()的函数和不带括号()的函数有什么区别 如果您有(),那么您可以调用它。如果你没有,那么你就没有 你能给我解释一下为什么结果会这样堆积吗 在第一个示例中,将函数传递给add,然后add函数调用它 在第二个示例中,

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

这是原始代码

函数添加(第一、第二、回调){
console.log(第一个+第二个);
回调();
}
函数logDone(){
控制台日志(“完成”);
}
添加(2,3,logDone)
如果调用带括号()的函数和不带括号()的函数有什么区别

如果您有
()
,那么您可以调用它。如果你没有,那么你就没有

你能给我解释一下为什么结果会这样堆积吗

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

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

当您执行
func([args=optional])
时,
func
将被调用或调用

如果我们调用一个带括号()和 没有括号()

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

通过在变量中存储对函数的引用,您可以稍后调用它,这就是
callback
所做的

在第二个代码段中,由于没有返回任何内容,回调将具有未定义的
。尝试通过在第二个代码段中执行
callback()
来调用它,您应该会看到一个错误声明

未定义
不是一个函数


在第一个示例中,您将函数作为参数传递。

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

第一个代码段的说明

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

第二段的解释

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

如您所见,第一个代码段实际上并不运行
回调
,直到在
add
函数中,而第二个代码段在
add
之前运行
回调
,这样它就可以将从
logDone
返回的任何内容传递到
add

中,当我将
logDone
声明更改为以下内容时,您可能会更清楚:

var logDone = function() {
    console.log("done");
}
标识符
logDone
基本上只是一个引用函数的变量。要执行(也是:调用或:调用)添加括号的函数:
logDone()

因此,在第一个示例中,您只是将函数本身作为第三个参数传递给
add()
,然后在
add()
内部执行
callback()

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

此外,语句
回调,在
添加
中,不执行任何操作。如果您像第一个示例中那样保留括号,则会导致错误,因为
undefined
2不是函数


1) 在本例中,它是未定义的,因为
logDone()
没有显式返回任何内容


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

因为没有括号,您还没有调用它-您只是将函数作为参数传递。它在
回调()中被调用行。当您通过在第二个代码段中添加括号来调用函数logDone时,您会得到控制台日志firstJavasScript,它首先计算参数。因此,如果您有
foo(bar())
,则首先调用
bar
,并将其返回值传递给
foo
。顺便说一句,大多数编程语言都是这样工作的。