浅析javascript执行引擎的执行顺序和时序模式
执行顺序
在同一个执行环境里面的javascript是按照时间顺序执行的。当javascript代码还在运行的时候,外部事件无法中断代码的运行,同时也不支持线程对任何共享内存的修改。
当执行引擎在忙的时候,事件处理、定时器、页面浏览的请求等动作都会往后延迟。在大多数情况下,整个浏览器里至少HTML渲染器部分基本处于不响应状态。只有在代码执行结束后,脚本引擎恢复空闲状态,才会重启对排队事件的处理。此时才有可能重新执行javascript代码。
案例:
更进一步说:javascript本身是没有sleep()和pause()这样的暂停功能来临时释放CPU,或在暂停结束后从同一位置重新开始执行。javascript的做法是:如果程序员希望推延某个脚本的执行,需要注册一个定时器,以便在延迟一段时间后能启动一个新的执行流。只有在触发了特定的处理器函数后,才开始这个执行流。
案例:
PS:在这套同步执行模式里面可能会存在一些漏洞,就是在调用类似alert()或者showModalDialog()函数的时候,吐过它们处于临时挂起的状态,系统其实仍然有可能执行其他的js代码。
案例:
时序模式
繁忙的javascript循环可能会引起浏览器被挂死这样的破坏性后果,所以在浏览器里面需要有一些能减缓此类问题影响的处理。实际上:任何死循环都能被中断推出,后果等价于一个未处理的异常。循环推出,引擎恢复到闲置状态,引起问题的代码也仍然可以被调用,所有的计时器和事件句柄也会保持原样。
由于CPU占用率特别高的代码执行能被中断,所以存在一个问题:那就是如果被攻击者刻意的去这样做,就能导致程序推出,使应用处于完全不确定状态,而非开发者原先预想的那样成功执行完成。