美文网首页
alert是如何阻断线程的

alert是如何阻断线程的

作者: 查理斯_Chalis | 来源:发表于2018-12-21 16:06 被阅读0次

JavaScript 引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行 JavaScript 程序,初衷是为了减少 DOM 等共享资源的冲突。可是单线程永远会面临着一个问题,那就是某一段代码阻塞会导致后续所有的任务都延迟。又由于 JavaScript 经常需要操作页面 DOM 和发送 HTTP 请求,这些 I/O 操作耗时一般都比较长,一旦阻塞,就会给用户非常差的使用体验。

于是便有了事件循环(event loop)的产生,JavaScript 将一些异步操作或 有I/O 阻塞的操作全都放到一个事件队列,先顺序执行同步 CPU代码,等到 JavaScript 引擎没有同步代码,CPU 空闲下来再读取事件队列的异步事件来依次执行。

这些事件包括:

1 setTimeout() 设置的异步延迟事件;
2 DOM 操作相关如布局和绘制事件;
3 网络 I/O 如 AJAX 请求事件;
4 用户操作事件,如鼠标点击、键盘敲击。

由于页面渲染是 DOM 操作,会被 JavaScript 引擎放入事件队列;
1 alert() 是 window 的内置函数,被认为是同步 CPU代码;
2 JavaScript 引擎会优先执行同步代码,alert 弹窗先出现;
3 alert 有特殊的阻塞性质,JavaScript 引擎的执行被阻塞住;
4 点击 alert 的“确定”,JavaScript 没有了阻塞,执行完同步代码后,又读取事件队列里的 DOM 操作,页面渲染完成。
由上述原因,导致了诡异的 “Alert执行顺序问题”。 我们无法将页面渲染变成同步操作,那么只好把 alert() 变为异步代码,从而才能在页面渲染之后执行。

相关文章

  • alert是如何阻断线程的

    JavaScript 引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行 JavaScript 程序...

  • console.log功能简述

    console.log()主要用于js的调试,相比于alert()操作会更好,原因在于alert()会阻断js脚本...

  • 前端错误集

    1.[]不等于null []?alert(1):alert(2),他是会输出1的 2.如何获取textarea的换...

  • NSAlert

    注意事项: 执行run Modal 会block 主线程等alert 退出modal 状态之后,主线程恢复运行。m...

  • 前端开发面试题总结(JS02)

    如何控制alert中的换行?\n alert(“p\np”); 请编写一个JavaScript函数 parseQu...

  • GCD线程调度时,利用dispatch_sync(dispatc

    我们知道在主线程中使用同步会照成线程死锁 在子线程中可以用来阻断后续操作 例如,子线程中有两个操作A,B, B需要...

  • Alert Manager架构介绍及集群功能实现

    Alert Manger 整体介绍 Alert Manger是用来处理alert的组件,这些alert由任意的客户...

  • alert()方法是如何阻塞JS的

    写了个表单,其中有个这样的设定: 输入密码,如果密码长度低于6位,则输入框颜色变黄,且弹出提醒“密码长度不低于6位...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

  • js微任务宏任务Event-loop

    js微任务宏任务Event-loop js是单线程的语言当我们触发alert之后如果不关闭,后面的console....

网友评论

      本文标题:alert是如何阻断线程的

      本文链接:https://www.haomeiwen.com/subject/jixvkqtx.html