回调不等同于异步,不回调也不等同于同步
至于阻塞,是在并行化已经跑起来之后,如果一项资源 A 在用完前 B 只能等着,这叫阻塞;
A 还没用完,不过在等待期间允许 B 用它,这叫非阻塞。
对于如同 js/node 的异步、python 的协程、erlang 的微线程,其实都是解释器(运行时)保持了一个事件队列,所有的异步调用都不过是在事件队列里新加事件, 所说的回调等也不过是加事件的形式。
因为JS 运行在浏览器中,是单线程的,每个 window 一个 JS 线程,既然是单线程的,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码。
而浏览器是事件驱动的(Event driven),浏览器中很多行为是异步(Asynchronized)的,会创建事件并放入执行队列中。
javascript 引擎是单线程处理它的任务队列,你可以理解成就是普通函数和回调函数构成的队列。
当异步事件发生时,如 mouse click, a timer firing, or an XMLHttpRequest completing(ajax),将他们放入执行队列,等待当前代码执行完成。
但是浏览器是多线程的,比如一个处理 JavaScript、一个处理页面的渲染、一个处理 http 请求,setTimeout 函数的意思就是告诉 js 引擎,在 xx 以后把 func 放到主事件队列中,等待当前的代码执行完毕再执行
更多:https://www.cnblogs.com/Mainz/p/3552717.html
把函数 b 传递给函数 a。执行 a 的时候,回调了 b,a 要一直等到 b 执行完才能继续执行;
把函数 b 传递给函数 a。执行 a 的时候,回调了 b,然后 a 就继续往后执行,b 独自执行。
请注意这里不要和多线程纠缠起来:线程是存在于一个进程里的,而异步回调可能是好几个进程。