浏览器事件环

1、浏览器的进程

  • 每一个页卡都是进程(互不影响)
  • 浏览器也有一个主进程(用户界面)
  • 渲染进程 每个页卡里都有一个渲染进程(浏览器内核)
  • 网络请求(处理请求)
  • GPU进程3d绘制
  • 第三方插件的进程

2、渲染进程(包含着多个线程)

  • GUI渲染线程(渲染页面的)
  • js引擎线程 他和页面渲染时互斥(GUI渲染线程和js引擎线程共用一个线程)
  • 事件触发线程 独立的线程 EventLoop
  • 事件click、setTimeout、ajax也是一个独立线程

面试题:

1、微任务和GUI渲染

<html>
    <head>

    </head>
    <body>
        <script>
            document.body.style.background = 'red';
            console.log(1)
            Promise.resolve().then(()=>{
                console.log(2)
                document.body.style.background = 'yellow';
            })
            console.log(3)
            // 1 3 2 页面一直是黄色 因为渲染是发生在微任务之后
        </script>
    </body>
</html>

 2、事件任务

<html>
    <head>

    </head>
    <body>
        <script>
            document.body.style.background = 'red';
            console.log(1)
            setTimeout(()=>{
                console.log(2)
                document.body.style.background = 'yellow';
            },0)
            console.log(3)
            // 1 3 2 页面不一定一直是黄色,因为浏览器会检测是否要重新渲染,浏览器有刷新频率 大约16.6ms
        </script>
    </body>
</html>

3、 事件任务

<html>
    <head>

    </head>
    <body>
        <button id="button"></button>
        <script>
            button.addEventListener('click',()=>{
                console.log('listener1')
                Promise.resolve().then(()=>console.log('micro task1'))
            })
            button.addEventListener('click',()=>{
                console.log('listener2')
                Promise.resolve().then(()=>console.log('micro task2'))
            })
            button.click();
            // 点击按钮 产生了两个宏任务 listener1 micro task1 listener2 micro task2
            // 不点击按钮 相当于直接执行方法调用 每个方位里产生微任务 listener1 listener2 micro task1 micro task2
        </script>
    </body>
</html>

4、定时器任务

<html>
    <head>

    </head>
    <body>
        <button id="button"></button>
        <script>
            Promise.resolve().then(()=>{
                console.log("Promise1")
                setTimeout(()=>{
                    console.log('setTimeout2')
                },0)
            })
            setTimeout(()=>{
                console.log('setTimeout1')
                Promise.resolve().then(()=>{
                    console.log('Promise2')
                })
                // 点击按钮 Promise1 setTimeout1 Promise2 setTimeout2
            })
        </script>
    </body>
</html>

 参考:

1、 微任务、宏任务与Event-Loop

2、微任务(Microtask)

3、事件循环:微任务和宏任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值