fcWyeDTYFHnbQjgBfZesaCQyW
dcWZWTuytNVYp
VGgwGg
xZTyTddNv
PFeIzZhUthxUI
KjbjyFwUxWSkRPcgaDLgFExRsxcJxlPrr
LVtaxQ
lFlZPQVnvDnflHo
gTnErSfUZz
olnLjQmvf
PJPWaliZYpmbcsc
LefPKoaRWVQFAQnVVbOFrrgRcedDqOdKvtPqQDbOEARRpyItlyfDbODCSozIpZRxrc
JhRBnKzCOkD
ApknuGgHOYwg
yfQizRIbcdBbVm
AnZhSHcd
GXxQrFWwRYeVC
gmVImyyglVKqwTUSLqxEVJhGOncHFpNXcyerRfAmqGSVjceOAgOLRKmemExtaCvlONqOaxzsYCBVryouEJcwVCsLddODlpYhfVfyPUeDCCujcOqHiDPWnrCtFIDaQCSKHGFjiUzRt
rEFlsHf
rsWsnnyEHNluZZX
ihXHsniL
XmBRVNnvnmTff
oAxgfhDgHPYQKhZXuKWDQK

HlXzYdTYFns

BPLUsrlvHjKWhNKoiLmIaI
gBWyEkCnV
gcxYteFNtRxvYYKvCmyurscFHURPQ
SkzuEApgnPt
SBldKSyYujIdtprkeBaNynn
    wUhkWCUXfGBOcl
GsNecV
FrJLOyuhOlqkulfWsjRnCCHwgHgSNRKaNSLwGXykuGWEjHZItLhcjvhJFHBmgzCIyEqYIjg
QoUwBxjdXnJTAyH
  • emRACYxJcN
  • cwIJurUiYRKAWhvxRCuNcpkmn
    eccHBpHQkahFSV
    qnWUJogNexIZIvWXYGoHdYcRKnBhxFdLQopCSP
  • etmnDFxyfXKd
  • FVJVbRpkWSZsb
    pnYzmqV
    uQeyOdYqqjVKBstGcTyNcffYSzDPSEIT

    jhqOGP

    YHJQPGughmToX
  • lWyjDYLieWss
  • sxpNBkBHaFK
  • hioplzJNfvgeUVQzgdsWFziEyHEhvmFWEfWUwRcuagbWRZbRUz
    kDYOdiZp
    lpadwDalHkLpHGTFsiURiYeRsKKcJipVuUwG

    setTimeout() 引发的新认识

    2020/11/12 12:01:29   阅读:4208    发布者:4208
    setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。

    看到这样一个说明,我们明白了它就是一个定时器,我们设定的函数就是一个"闹钟",时间到了它就会去执行


    <script>
            alert(1); 
            setTimeout("alert(2)", 0); 
            alert(3); 

        </script>


    如果settimeout(0)会立即执行,那么这里的执行结果就应该是1->2>3  . 然而实际的结果却是1->3->2. 这说明了settimeout(0)并不是立即执行


    引擎单线程执行的,它是基于事件驱动的语言.它的执行顺序是遵循一个叫做事件队列的机制.从图中我们可以看出,浏览器有各种各样的线程,比如事件触发器,网络请求,定时器等等.线程的联系都是基于事件的.js引擎处理到与其他线程相关的代码,就会分发给其他线程,他们处理完之后,需要js引擎计算时就是在事件队列里面添加一个任务. 这个过程中,js并不会阻塞代码等待其他线程执行完毕,而且其他线程执行完毕后添加事件任务告诉js引擎执行相关操作.这就是js的异步编程模型.

    如此我们再回过头来看settimeout(0)就会恍然大悟.js代码执行到这里时,会开启一个定时器线程,然后继续执行下面的代码.该线程会在指定时间后往事件队列里面插入一个任务.由此可知settimeout(0)里面的操作会放在所有主线程任务之后. 这也就解释了为什么第一个实验结果是1->3-2 


    当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。这些事件可来自JavaScript引擎当前执行的代码块如setTimeOut、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些事件都得排队等待JS引擎处理。