我对javascript回调函数有一个担忧。我了解的是,如果需要时间,回调函数应允许其他语句继续执行。因此,我创建了一个自定义回调函数进行检查,但没有得到预期的结果。我在这里做错什么吗?
function test(param1,param2,cb){
if(typeof(cb) === 'function') return cb(param1,param2)
else console.log('im not a func');
}
function calbackFunc(a,b){
console.log('Hi i am '+a+' '+b);
}
setTimeout(function timeout(){
console.log('timeout')
},0);
test('callback','function',calbackFunc);
console.log('console');
“嗨,我是回调函数”
“控制台”
“超时”
根据回调函数,应首先使用“控制台”。但是这没有发生。就像setTimeout正常工作一样。那为什么我的自定义回调函数表现得像setTimeout。
答案 0 :(得分:1)
您在 Stack 和 Queue 之间感到困惑。
在javascript中,同步调用进入堆栈,异步调用进入堆,完成后返回排队。仅当函数为空时,它才会从 Queue 移到 Stack 。
setTimeout()
这会将函数放入 heap 中,并且由于超时设置为0,因此立即移到_queue。这是否意味着它立即执行?不,因为您当前的功能(“主”功能)尚未完成。
test()
此代码是同步!在调用test
时,我们向 stack 中添加了一个函数。然后将cb()
调用添加到 stack 中。
这意味着我们需要先完成所有这两项工作,然后才能进入第3阶段。
console.log
这里什么也不能解释
当前“主 stack ”已完成,因此 queue 中的函数现在已添加到 stack 中,并记录{{1} }。