本系列文章是本人学习相关知识时所积累的笔记,以记录自己的学习历程,也为了方便回顾知识;故文章内容较为随意简练,抱着学习目的来的同学务必转移他处,以免我误人子弟~

    今天看到一段js深拷贝的代码

    1. // MessageChannel
    2. function structuralClone(obj) {
    3. return new Promise(resolve => {
    4. const {port1, port2} = new MessageChannel();
    5. port2.onmessage = ev => resolve(ev.data);
    6. port1.postMessage(obj);
    7. });
    8. }
    9. var obj = {a: 1, b: {
    10. c: b
    11. }}
    12. // 注意该方法是异步的
    13. // 可以处理 undefined 和循环引用对象
    14. (async () => {
    15. const clone = await structuralClone(obj)
    16. })()

    使用的是我前所未闻的 MessageChannel 对象接口
    一搜索发现了 micro taskmacro task 等概念
    在搜索发现了 javascript 的 eventloop
    eventloop 倒是经常听到,今天就来一探究竟。。。

    参考资料
    MessageChannel是什么,怎么使用?
    阮一峰:什么是 Event Loop?
    阮一峰:JavaScript 运行机制详解:再谈Event Loop
    Javascript 基础夯实——理解 Event Loop、Micro Task & Macro Task

    所以严格意义上来讲,javascript 不是单线程的???

    eventloop 实现了 javascript 的异步模式

    主任务(同步代码) ——> micro task(Promise) ——> 渲染视图 ——> macro task(setTimeout)

    知乎:详解JavaScript中的Event Loop(事件循环)机制

    虽然nodejs中的也存在与传统浏览器环境下的相似的事件循环。然而两者间却有着诸多不同