Javascript自定义回调函数

时间:2018-07-11 11:26:15

标签: javascript callback

我对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。

1 个答案:

答案 0 :(得分:1)

您在 Stack Queue 之间感到困惑。

事件循环

javascript中,同步调用进入堆栈,异步调用进入,完成后返回排队。仅当函数为空时,它才会从 Queue 移到 Stack

enter image description here

在您的示例中

阶段1:致电setTimeout()

这会将函数放入 heap 中,并且由于超时设置为0,因此立即移到_queue。这是否意味着它立即执行?不,因为您当前的功能(“主”功能)尚未完成。

阶段2:致电test()

此代码是同步!在调用test时,我们向 stack 中添加了一个函数。然后将cb()调用添加到 stack 中。 这意味着我们需要先完成所有这两项工作,然后才能进入第3阶段。

阶段3:console.log

这里什么也不能解释

第3阶段后

当前“主 stack ”已完成,因此 queue 中的函数现在已添加到 stack 中,并记录{{1} }。