我是javascript的新手,我正在努力了解回调。我无法理解为什么20在10之前被打印。我的理解是回调函数,如 - func1(parameter,func2())
,func2()
是回调函数,它在func1
执行后执行传递给func1
的“参数”。我的理解是否正确?
function timePass(length){
console.log("finished after doing timePass for "+length +" seconds")
}
timePass(10,timePass(20));
输出如下:
完成timePass 20秒后完成
完成timePass 10秒后完成
答案 0 :(得分:4)
你并没有真正创建一个回调函数,但实际上是在最后一行代码的其他所有内容之前调用timePass(20)。
要传递回调函数,您应该执行以下操作:
function timePass(length,callback){
console.log("finished after doing timePass for "+length +" seconds")
if(typeof(callback) == "function")
callback(20);
}
timePass(10,timePass);
答案 1 :(得分:2)
基本上当解释器正在查看它时,它将调用timepass(20)
来评估结果(这没什么,因为你没有返回返回的东西),然后它尝试传递给外部函数。
即。
doFunction( doSomethingElse() );
如果doSomethingElse
返回1,则必须先评估该值,然后才能将该值传递给doFunction
。
从根本上说,你实际上没有通过回调,你已经调用了这个函数。也许你的意思是:
callback = function() { somecode; }
target = function(data, callback) { console.log('hi'); callback(); }
target(10, callback);
注意缺少()
,即callback
而非callback()
答案 2 :(得分:2)
这是因为您执行函数timePass
然后 - 将结果添加为参数编号2.
解释发生了什么:
首先定义新功能“timePass”,在控制台上打印功能
其次,你执行timePass(10, /*But here you execute it again*/ timePass(20))
。
函数timePass(20)将首先执行,因为您添加了()
() == execute
。如果您只是传递函数的名称,它将作为函数传递。当您使用()
时,它将被执行,然后结果将作为参数传递。
function timePass(length, callbackFunction){
console.log("finished after doing timePass for "+length +" seconds");
// check if the function caller is included callback parameter
// and check if it is function - to prevent errors.
if (callbackFunction && typeof callbackFunction == "function") {
// Execute the callback (timePass)
callbackFunction(20);
}
}
// Here you say, Execute timePass with arg 10, and then call timePass
timePass(10, timePass);
// and now callbackFunction defined above will be == timePass
// You can do also
timePass(10, anotherFunction)
// So another function will be executed after console.log()
使用案例
我们在处理异步代码时会使用大多数回调。
例如:Jsfiddle
// Imagine we have function which will request the server for some data.
function getData(index) {
// The request - response will took some time
// 0.1s ? 15s ? We don't know how big is the data we downloading.
var data;
// Imagine this is an AJAX call, not timeout.
setTimeout(function() {
// after 30ms we recieved 'server data'
data = 'server data';
},30)
return data;
}
var users = getData('users');
console.log(users); // undefined - because we returned "data" before the AJAX is completed.
/*
So we can change the function and adding an callback.
*/
function getAsyncData(index, callback) {
var data;
// Imagine this is an AJAX call, not timeout.
setTimeout(function() {
// after 30ms we recieved 'server data'
data = 'server data';
callback(data);
},30)
}
getAsyncData('users', function(data) {
console.log(data); // 'server data'
});
// OR
function processData(data) {
console.log(data);
}
getAsyncData('users', processData); // processData also logs 'server data'