知识储备JS是单线程语言
JS是单线程的脚本语言,即在同一时间只能做一件事。为了协调时间/用户交互/脚本/UI渲染和网络处理等行为,防止主线程堵塞,这才有了事件循环机制。
JS作为主要运行在浏览器的脚本语言,主要的工作之一就是操作DOM。若JS有两个线程的话,那么如果这两个线程对同一DOM进行操作,这样浏览器就会错乱,无法判断这两个线程的优先级。
因为JS是单线程语言,当遇到多个任务时,不可能一直等待任务完成,这会造成巨大的资源浪费。
执行栈
所有任务都在主线程上执行,形成执行栈
任务队列
存放异步任务的运行结果
new Promise是同步任务
Promise.resolve().then()是微任务
macro-task(宏任务)
scripsetTimeoutsetIntervalsetImmediateI/O操作UI 渲染
micro-task(微任务)
process.nextTickPromiseAsync/AwaitMutationObserver主线程
主线程规定了要执行执行栈中的哪个事件
利用Node运行JS,助力**效率
众所周知,Node 是一个JS运行**,浏览器也是一个运行**,JS代码写好之后需要放到浏览器里面去运行,脱离了浏览器是没有办法运行的。
但是,现在不仅浏览器能运行JS,Node也能运行JS。
新建一个obj.js文件,在里面写JS代码:
// JS复制或删除对象的部分属性const { console } = require("console")// 需求:数据复制功能,新的数据只需要源数据的部分属性。// 以月度目标为例,源数据为:let monthlyTarget = { life: 'keep early hours', work: 'increase of efficiency', sport: 'Half an hour a day', read: 'an hour a day', food: 'cook by yourself'}// 先复制所有字段,再删除不要的字段// 注意:复制时不要直接用 monthlyTarget=newMonthlyTarget ,这样删除newMonthlyTarget的属性时,monthlyTarget的属性也会被删除。const newMonthlyTarget = { ...monthlyTarget }console.log(newMonthlyTarget)delete newMonthlyTarget.foodconsole.log("newMonthlyTarget",newMonthlyTarget)
打开终端输入运行命令即可。
像平时写练手的 Demo 就可以直接新建一个.js文件,然后用 Node 去运行,就不需要去浏览器查阅了。
Node.js采用V8作为js的解析引擎,I/O处理使用自己设计的libuv。
macro-task(宏任务)
scripsetTimeoutsetIntervalsetImmediateI/O操作
micro-task(微任务)
process.nextTick(在微任务队列执行之前执行)new Promise().then(回调)Node.js的运行机制V8引擎解析JS脚本解析后的代码,调用Node APIlibuv库负责Node API的执行。它将不同的任务分配给不同的线程,形成一个事件循环,以异步的**将任务的执行结果返回给V8引擎。V8引擎再将结果返回给用户。结尾
每个人都有自己的花期,我是说,我们都会等到鲜花绽放的那一天。在那之前,要做的是:储备好养分~
下次见!