关于javascript回调函数的问题

我一直有个疑问,在大部分讲回调的书都会这么写,js是单线程,每次执行一个任务,从而一个任务处理事件很长,后面的任务也不能执行,所以出现了异步,一个任务结束了会执行他的回调函数,后面的任务不用等他执行完,这样程序执行的顺序就不是代码从上而下的逻辑了

比如f1(f2)

function f1(cb){
    settimeout(function(){
    f1code
    cb()
    },delay)
}

我还是不能理解啊,这样f1运行完才能执行f2,既然是单线程,后面的程序比如是f3为什么可以不等f1执行完,f1还在运行啊,线程不会被阻塞吗?还有这样f1运行完就会运行f2,若是f3需要f1处理的数据,f1还没运行完f3已经开始了,不就出错了吗?

阅读 3.3k
5 个回答

之前看nodejs的异步,大概是如果出现异步操作,则nodejs引擎将该操作交由操作系统的异步程序(不同的操作系统有不同的程序,名字忘记了)执行,如果操作系统执行完则通知nodejs引擎,nodejs引擎会先执行同步操作(异步操作提交给操作系统,并跳过),执行完了之后等待操作系统通知,开始执行回调。。所以,正因为是单线程,异步操作才需要回调。。

所以异步操作不会阻塞,因为此时是操作系统在执行。。但是回调会阻塞,一旦回调写法不对(嵌套等等),就会阻塞

大致是就是这样,个人理解,如果有误请见谅

如果f3需要f1处理的数据,f3就得作为f1的回调

f1(f2,f3)
function f1(cb,db){
    settimeout(function(){
    f1code
    cb();
    db();
    },delay)
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏