js 单线程是指:解析js的引擎是按单线程去解析js 的
单线程任务也称作为同步任务: 程序语言中的同步与现实生活中的同步恰好是相反的概念,js语言中的同步是指,必须先执行完上一步的程序,在执行下一步的程序,而不是同时执行。
同步任务:先执行完上面的程序,再执行下面的程序,如果程序执行不下去有问题叫做线程阻塞。
异步任务:是指同时执行不同程序
异步任务一定有回调函数,但是回调函数不一定是异步:
左边是执行栈,右边是任务栈: js 会先执行执行栈里的线程,然后再加载异步任务(回调函数)
因此定时器的时间间隔其实并不准确,因为还有一段时间是加载主线程任务的,无法算进时间间隔中。
执行栈里是同步任务
js执行顺序:
解读2:一旦异步有了运行结果,就会将结果放到任务栈里:比如定时器,过了时间间隔才会把定时器放到任务栈里
3.主线程执行完毕,就会读取任务队列,然后将任务队列加载到主线程中。
4.重复执行以上三步,因为,主线程其实可能并未执行完成,因为客户端会与用户有个交互过程,用户可能会提出新任务放进执行栈里。用户也可能会生成定时器放进任务栈里。
ajax node 都是异步
五个定时器打印五次,主线程执行完,i 为 5,再执行任务栈,打印五个5
解决方法:把定时器放进闭包函数里
注意:异步是指回调函数是异步,但是时间间隔里的参数不是异步:所以回调函数里面的i 是5
如下:时间间隔里面的i 是会从0 加一递增的
因为只有回调函数是异步,因此可以利用传参的形式,令任务栈里的异步函数实时接收变化的执行栈里的参数:
但是必须注意:令异步接收实时的同步参数,形参必须是与实参一致的 比如 i 与 i 对应:否则:(所以,注意不管什么时候写函数,最好形参与实参变量名要一致)
因为这种传进去的i 相当于在函数体内生成AO,打印的i 会直接找AO,
浏览器:js同步 渲染异步(html css) 任务异步 三者其实分不开