zoukankan      html  css  js  c++  java
  • setTimeout(fn, 0)引发的JavaScipt线程的思考

    • 起因
      • 周五改一个checkbox的display属性被错误地设置为none的bug. 经debug发现, 有两个地方修改了display属性: 1) checkbox的controller; 2) checkbox的parent(container). 前者先将display属性更新为block(正确), 后者再次更新为none(错误). 普通的思路是, 修改checkbox的container的代码, 使其能正确更新display值. 但另有一种更巧妙的方法, 就是修改checkbox的controller的代码, 将更新display相关的函数fn放在setTimeout中 -- setTimeout(fn, 0). 
    • 参考
    • 总结
      • 浏览器内核的多线程机制
        • 常驻
          • JS Engine线程
            • JS Engine为事件驱动型
            • 事件来源
              • 来自JS Engine当前执行的代码块, 例:
                • setTimeout添加一个任务
              • 来自浏览器内核其他线程, 例:
                • 事件触发线程
                  •   如,界面元素鼠标点击事件
                • 定时器线程?
                  •   定时触发器时间到达通知(与setTimeout的差异?)
                • http请求线程
                  •   异步请求状态变更通知, 异步XHR
                  •      script element onload? (load一个js file之后执行)
                • UI渲染线程
                  •   transitionend, animationend
            • 任务实体: 回调函数
          • UI渲染线程
          • 事件触发线程
        • 非常驻
          • http请求线程
    • 待探索的问题
      • setTimeout & 闭包
      • hit breakpoint 的线程处于什么状态?
      • JS Engine的任务过程能否被打断? (目前看来似乎不能被打断)
    Wisdom dawns when names and forms vanish.
  • 相关阅读:
    实现一个最简单的flask应用程序
    python常识
    Flex布局
    ES6的promise的学习
    通过正则获取url参数
    dom0级事件和dom2级事件
    sea.js总结
    跨域的几种方式
    人生苦短,生命也就一次,机会也就一次
    新开的博客先和大家打个招呼吧!
  • 原文地址:https://www.cnblogs.com/gentlemint/p/5173506.html
Copyright © 2011-2022 走看看