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