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)  任务异步   三者其实分不开