JavaScript引擎是单线线程,JS代码只能从上到下执行。
JS具有构建的settimeout函数,该功能指定毫秒后的函数或某个代码。
使用这样的代码,根据JS是一个线程,输出结果应为1,1秒后输出2,最后输出3.但是,事实是,首先输出1和3,然后在1秒后输出2。
为什么当Settimeout()函数执行SetTimeout()函数时,以下以下表达式不会被阻止,而是忽略SettiMeout的运行状态并继续执行它?
如果所有代码均在JS主线程上执行,则如果Settimeout的延迟很长,则以下代码一直在等待Settimeout返回成功,那么JS的效率太低,因此为了解决此问题,浏览此问题并浏览到浏览设备已参与其他几个线程的操作,以帮助JS主线程。
其中,JS引擎线程是主线程,它是运行JS代码的线程。Settimeout线程是异步线程。
为了实现非块,它主要基于异步。如何实现?有一个静态任务队列存储在存储异步处理后返回的回调函数。
在主线程中排队的任务很常见:
在异步线程(例如settimeout和ajax)上执行的任务很常见。
一开始,执行主线程,然后检测到功能,然后将其移交给响应异步线程处理。之后,主线程跳过并继续执行以下操作。执行后,延迟1秒后,回调功能输入了任务队列。在完成主线程的同步任务后,它进入了自由期,因此我开始询问任务队列是否具有完成主线程的任务。目前,任务队列已完成。此时,在上一个操作完成后,任务Queuethe恢复功能已被取出到主线程执行,因此执行了回调功能中的内容。(实际上,主线程中有一个中介,异步,线程和任务队列。
从上面的描述中,可以知道,由于JS的异步特性,函数执行的时机是不同的,最终输出的结果也可能有所不同。尤其是异步函数,因为存在的时间在主线程中调用和实际执行的实际执行是不一致的,在此过程中,异步功能中涉及的变量可能发生了变化,并且输出结果可能无法满足这些初学者的期望。
此代码的输出值为6 6 6 6 6 6 6,而不是0 1 2 3 4 5.原因如上所述。异步函数在开始时未在主线程中执行。变量语句,然后执行for循环,for Cycle中的每个周期执行异步函数,并且此异步函数将移至SetteMeTimeout Timer Trigger trigger线程中。在执行此异步线程之后,在等待主线程调用的队列中是6个回调函数。六个周期结束后,循环的同步任务结束了,并且在主线程中没有执行的任务。询问任务队列是否为空,在任务队列中有6个。这次,我已成为6,所以6 6 6是输出。
此代码输出值不是6 6 6 6 6 6 6,而是0 1 2 3 4 5.原因是将变量i放置在for loop参数列表中。执行最终执行时,不是I,而是前一个i在不同阶段创建的副本。