即时学习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行)
我的问题是:
你能解释一下为什么我的结果堆积如此吗?
如果我们用括号()和没有括号()调用函数会有什么区别?
答案 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)
在第一个示例中,您将函数作为参数传递 在第二个示例中,您将调用后的函数结果作为参数传递。