一个面试题续问

来源:3-10 vue组件更新之后如何获取最新DOM

THEEND0123

2021-02-26

<div id="outer" @click="fn">
  <div @click="fn" id="inner">
    click me
  </div>
</div>

methods: {
    fn() {
      console.log('start');
      setTimeout(() => {
        console.log('timeout');
      }, 0);
      this.$nextTick(() => {
        console.log('nextTick');  
        this.$nextTick(() => { console.log('nextTick2'); });
        setTimeout(() => { console.log('timeout2'); });
      });
      console.log('end');
    }
  }

点击outer的时候,执行fn的结果如下

因为nextTick是基于promise实现的,优先级高于setTimeout

start
end
nextTick
nextTick2
timeout
timeout2


点击inner的时候,由于冒泡会执行两次fn,结果如下:

start
end
nextTick
nextTick2
start
end
nextTick
nextTick2
timeout
timeout2
timeout
timeout2

点击 inner,根据事件冒泡机制,会执行两次 click事件,即两次 fnDOM事件的执行机制,其实有点类似于 setTimeout,也是基于异步队列和 event loop实现的。而不是用原生 js执行了两次 fn();

这就类似于用 setTimeout触发了两次 fn

setTimeout(fn);
setTimeout(fn);

以上参考自https://coding.imooc.com/learn/questiondetail/173346.html
老师我的理解是 => 您看是否有问题
是因为primise是微任务,Promise(它只是异步管理工具,并不代表就是异步)中没有异步,实际这里就当作同步就行了,事件轮询机制,先执行微任务队列,再dom渲染,紧接着执行第二次fn,过程还是一样,最后执行宏任务(setTimeout),即将两次调用fn的宏任务全执行完。我理解主要是微任务之后就尝试渲染了,因此会nextTicknextTick2就执行startend了。

写回答

3回答

双越

2021-02-26

没问题

1
0

qq_w_354

2024-04-06

你是在拉屎?困惑重提

0
0

阿聪M

2021-08-12

冒泡是 比 微任务慢吗?

0
1
要啥要啥自行车
DOM操作是宏任务,冒泡执行两次fn的话,可以理解为两个fn分别是两个宏任务
2022-06-26
共1条回复

2024版 前端框架及项目面试 聚焦Vue3/React/Webpack

面向1-3年前端的框架及项目面试“刚需内容”

4664 学习 · 1644 问题

查看课程