JavaScript 运行机制

新生代总结 JavaScript 运行机制解析 新生代总结 JavaScript 运行机制解析 大家好,我是小丞同学,一名准大二的前端爱好者 这篇文章将带你一起学习理解 JavaScript 运行机制 愿你忠于自己,热爱生活 引言 在一些面试中,我们或许会被问到这样的问题 简述一下 JavaScript 的运行机制? 你还有可能会被问这样简单的代码 setTimeout(function () { console.log('定时器开始啦') }); new Promise(function (r 阅读详情

一、单线程

JavaScript 是单线程,H5 允许 JavaScript 创建多个线程,但是子线程受主线程控制,并且不能操作 DOM
所有任务分为同步任务和异步任务

  • 同步任务:在主线程中按顺序执行,这些任务形成一个执行栈
  • 异步任务:不会立即执行,放到任务队列中,当异步任务完成后,会将对应的事件放到任务队列中

二、异步执行机制

2.1 执行栈

存放同步任务,按照任务的顺序处理

2.2 任务队列

异步任务的结果放在任务队列中,等待主线程的处理。本身不会立马执行,而是等待执行条件满足时(如 I/O 操作完成、定时器到期)才会执行

2.3 事件循环

当执行栈中同步任务全部完成后,事件循环会检查任务队列中是否有异步任务的结果
如果有待处理的异步任务,事件循环就会将这些任务逐个取出,放到执行栈中执行
主线程会不断重复这个过程:执行栈中的同步任务,检查任务队列中的异步任务

三、宏任务、微任务

3.1 宏任务

宏任务通常是指在事件循环的每一个循环中执行的任务,主要由 JavaScript 引擎和浏览器控制
常见的宏任务:

  • script
  • setTimeout
  • setInterval
  • setImmediate(Node.js 环境)
  • I/O 操作
  • UI 渲染(例如,浏览器的页面渲染和重绘)
  • postMessage(跨线程消息传递)
  • requestAnimationFrame(浏览器的动画帧请求)

3.2 微任务

微任务是在当前宏任务完成后、下一个宏任务开始之前执行的任务,微任务主要用于处理异步操作的回调
常见的微任务:

  • Promise 的 then/catch/finally(非 new Promise)
  • MutationObserver(监听 DOM 变动,浏览器环境)
  • process.nextTick(Node.js 环境)
  • Object.observe

3.3 执行顺序

1)执行当前宏任务: 事件循环从宏任务队列中取出一个任务并执行,例如 setTimeout 的回调

2)执行所有微任务: 当前宏任务完成后,事件循环会处理所有在微任务队列中的任务,微任务队列会在宏任务队列之前被清空

3)渲染和更新 UI: 在微任务队列执行完后,浏览器会更新渲染,确保 DOM 和 UI 的改变被显示出来。此时,浏览器会执行重绘和布局操作

4)执行下一个宏任务: 事件循环继续到下一个宏任务,并重复上述过程

注意: setTimeOut 并不是直接的把回调函数放进上述的异步队列中去,而是在定时器的时间到了之后,把回调函数放到执行异步队列中去。如果此时这个队列已经有很多任务了,那就排在他们的后面。这也就解释了为什么 setTimeOut 不能精准执行的问题了。setTimeOut 执行需要满足两个条件:

  • 主进程必须是空闲的状态,如果到时间了,主进程不空闲也不会执行回调函数
  • 这个回调函数需要等到插入异步队列时前面的异步函数都执行完了,才会执行

四、async、await

async/await 是异步编程的终极解决方案
async 是"异步"的意思,而 await 是等待的意思,await 用于等待一个异步任务执行完成的结果

  • async/await 是一种编写异步代码的新方法(以前是采用回调和 promise)
  • async/await 是建立在 promise 的基础上,像 promise 一样,也是非阻塞的
  • async/await 让异步代码看起来、表现起来更像同步代码

async 修饰的函数就是异步函数,该函数的返回值是 promise 对象。await 只能写在 async 修饰的函数里,await修饰的代码会等待。在函数里,碰到 await 修饰的代码时,await 朝后的代码都会等待

尤其需要注意的是async,await,promise,setTimeout 的执行顺序,具体例子如下:

async function async1() {
        console.log('async1 start');
        await async2();
        console.log('asnyc1 end');
}
async function async2() {
        console.log('async2');
}
console.log('script start');
setTimeout(() => {
        console.log('setTimeOut');
}, 0);
async1();
new Promise(function (reslove) {
        console.log('promise1');
        reslove();
}).then(function () {
        console.log('promise2');
})
console.log('script end');

执行顺序:
script start
async1 start
async2
promise1
script end
asnyc1 end
promise2
setTimeOut

执行的流程:

- 整个代码片段(script)作为一个宏任务执行console.log('script start'),输出script start
- 执行setTimeout,是一个异步动作,放入宏任务异步队列中
- 执行async1(),输出async1 start,继续向下执行
- 执行async2(),输出async2,并返回了一个promise对象
  await让出了线程,把返回的promise加入了微任务异步队列
  所以async1()下面的代码也要等待上面完成后继续执行
- 执行 new Promise,输出promise1,然后将resolve()放入微任务异步队列
- 执行console.log('script end'),输出script end
到此同步的代码就都执行完成了,然后去微任务异步队列里去获取任务
- 接下来执行resolve(async2返回的promise返回的),输出了async1 end
- 然后执行resolve(new Promise的),输出了promise2
- 最后执行setTimeout,输出了setTimeout

在第4步中, await 这里有一个机制, 就是 await 的等待, 不会阻塞外部函数的执行, 而 await 等待的 如果是一个 Promise 则 Promise 里面的代码还是同步执行;如果不是 Promise ,就会使用 Promise.resolve 来进行封装, 这里的 async2 是一个 async 方法, 里面的打印会同步执行, 而 await async2() 后面的代码会放到微任务队列中的第一个位置,等待外部同步代码执行完毕以后再执行

面试:JS运行机制 JS运行机制 阅读详情

相关推荐

基于Java+Maven+Testng+RestAssured+Allure+Jenkins搭建一个接口自动化框架

2、有一个提取表达式列,通过编写每个接口的JSON提取表达式,后边在解析Excel时,对接口执行后的响应数据用该表达式提取出来,保存到环境变量,如果某些接口需要前置接口的响应数据,我们就可以从环境变量中获取该数据出来,从而解决了接口关联的问题。1、在之前介绍过全局配置类Contants中添加一个控制台日志开关控制权限,如果选择为false,则控制台不输出日志,将日志输出到allure报表,选择为true,则在控制台输出日志,不输出到allure报表。

专注于技术分享的博主 1185

JavaScript的运行机制

JavaScript采用单线程事件循环机制处理异步操作,避免多线程冲突。同步代码通过执行栈(LIFO)运行,异步回调则进入任务队列。事件循环在栈空时从队列中取出任务执行。任务分为高优先级的微任务(如Promise)和低优先级的宏任务(如setTimeout),执行顺序为:清空微任务→执行一个宏任务→循环。浏览器和Node.js的实现细节略有不同。这种机制保证了非阻塞操作和页面流畅性,是理解JavaScript异步编程的核心。

weixin_56435707的博客 691

解决vscode 连接服务器报错:The remote host may not meet VS Code Server‘s prerequisites for glibc and libstdc++

解决vscode远程连接服务器报错:The remote host may not meet VS Code Server's prerequisites for glibc and libstdc++ (The remote host does not meet the prerequisites for running VS Code Server)

qq_37200100的博客 9912

JavaScript运行机制

另一方面,宏任务的执行是在当前任务结束后才会执行的,这意味着可以将一些耗时的操作放入宏任务队列中,从而避免阻塞当前任务的执行。它可以让JavaScript在执行一个任务的同时,监听其他异步事件的发生,并在合适的时机将它们加入到任务队列中(由事件触发线程完成),当同步任务全部执行完毕后,会创建一个类似while(true)的循环,每执行一次循环体的过程称为Tick,每次Tick的过程就是查看任务队列中是否有待处理事件,如果有则取出相关事件及回调函数放入执行栈中由主线程执行。进程:CPU资源分配的最小单位。

qq_15595829的博客 987

10X Genomics数据实战:手把手教你用Seurat处理单细胞PBMC数据(附完整代码)

本文详细介绍了如何使用Seurat处理10X Genomics的单细胞PBMC数据,从数据获取、质控到降维分析和细胞分群的全流程。通过实战代码演示,帮助研究者掌握单细胞RNA测序数据分析的核心技术,提升对细胞异质性的理解。

weixin_29053577的博客 254

【实战指南】OpenClaw Telegram 群聊不响应完整解决方案:从获取群 ID 到关闭隐私模式全流程

将整个从“获取群组 ID → 配置 OpenClaw Telegram 通道 → 关闭隐私模式 → 测试”的全流程都整合进去。

hampeter的博客 3491

「硬核JS」一次搞懂JS运行机制

前言本文首发于掘金,PC端点击文章末尾阅读原文观看体验更好从开始做前端到目前为止,陆续看了很多帖子讲JS运行机制,看过不久就忘了,还是自己理一遍好些通过码字使自己对JS运行机制相关内容更...

isboyjc的博客 310

Simulink中Simscape—Fluids模块(原Simhydraulics)学习记录

学习来源:http://cn.mathworks.com/help/physmod/hydro/getting-started-with-simhydraulics.html 主要学习内容如下图: 详细内容: 1、组件来源 SIMULINK浏览器中的模块:Simscape_Foundation 和 Simscape_Fluids。 2、Simscape下包括多个子

1万+

JavaScript单线程的运行机制

每一种语言都有自己的运行机制,javascript当然也不例外,了解了js的运行机制,对于想要深入学习js的我们来说有着莫大的帮助。好了话不多说,下面开始讲述一js的整个运行机制,但是在此之前你先要了解几个概念。下面一一列举,并配合实例来帮助大家理解记忆。 一、js是一门单线程的语言 那什么是单线程呢。? 单线程通俗的来说就是同一时间只能做一件事情,不能同时做几件事情,与传统的后台编程...

问白的博客 6277

在armv8架构中,有哪些是serror

(3)、RAS(Reliability, Availability, and Serviceability)错误:一些对于系统的可靠性、可用性和可维护性有影响的错误可能会触发 SError。(2)、ECC(Error Correction Code)错误:在访问带有错误校验的内存(如ECC内存)时,如果发现错误校验失败,可能会产生SError。2、其实呢,大多数Serror都是实现定义的,真正实现的serror就没有多少个。Serror(也称System Error),是异步异常的一种,一般是来自。

baron-周贺贺-代码改变世界ctw 1013

算法真的是个很有用的东西,通过python或者golang实现对N张图片的自动排版,每张图片的长和宽都不一样,有的是横图,有的是竖图,最终需要生成一张完整的矩形图片

算法真的是个很有用的东西,通过python或者golang实现对N张图片的自动排版,每张图片的长和宽都不一样,有的是横图,有的是竖图,最终需要生成一张完整的矩形图片。

代码讲故事 503

js之堆栈内存,运行机制。

js的堆栈机制栈内存堆内存 栈内存 从电脑内存中分配一块出来,用来执行代码的内存,Stack 先创建变量,再做赋值操作 分配一个主线程来自上而下执行。(js单线程,浏览器多线程) 主要用来运行代码,和存储基本类型。 基本数据类型存储 变量存储空间,存创建的变量 值存储空间,存基本数据类型的值 一个值存储空间可以对应多个变量,一个变量只能对应一个值存储空间。 堆内存 从内存中有拿...

前端技术栈 2322

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深入浅出JavaScript运行机制

一、引子 本文介绍JavaScript运行机制,这一部分比较抽象,我们先从一道面试题入手: console.log(1); setTimeout(function(){ console.log(3); },0); console.log(2); 请问数字打印顺序是什么? 复制代码 这一题看似很简单,但如果你不了解JavaScript运行机制,很容易就答错了。题目的答案是依次输出1 2 3,...

qa60014359的博客 202

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【JS】JavaScript引擎的内部运行机制

JavaScript引擎的内部运行机制,前端必学

LZGS_4的专栏 1336

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JS_day05-JavaScript运行机制

JavaScript运行机制 代码: let a=20; const b=30; var c; function multiply(e,f){ var g=20; return e*f*g; } c=multiply(20,30); console.log(c) 可整理成: function multiply(e,f){ var g=20; return e*f*g; } var c; //只执行这三条 let a=20; const b=30; c=multiply(20,30); 1、当代码运行时,Ja

qq_44787579的博客 142

JavaScript 的运行机制

前言 参看文章: 这一次,彻底弄懂 JavaScript 执行机制 JavaScript 运行机制详解:再谈Event Loop 作为一个前端er,最基本的要求也得知道js的运行机制叭。由于js是单线程的,所以js是按顺序执行的。 console.log('1') console.log('2') 输出:1,2。果然是按顺序执行的。本文结束。 来点复杂的。 setTimeout(fun...

weixin_30569153的博客 79

JS运行机制

链接: MDN 并发模型与事件循环 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理

boringsummers的博客 163

JS · 函数的运行机制

函数的运行机制 @(函数)[运行机制| 其他细节事项] 构图: //=>创建函数 function f() { var a = 10; a+=10; a/=2; console.log(a); } //执行函数 f(); 函数的运行机制,我们了解过函数即是引用类型: 在 JavaScript 中,几乎“所有事物”都是对象。 布尔是对...

Mr_Duoduo的博客 737

JavaScript运行机制 js底层学习

首先从Nrtwork/cache获取到JavaScript代码 经过 parser转义处理生成AST(抽象语法树),之后通过Ignition编译器编译为字节码,之后CPU就可以运行这些二进制字节码渲染到页面上;V8引擎有个很优秀的机制Deoptimization反馈, 它可以预判我们执行的代码,如某个函数调用频率较高,他会反作用与编译器,编译器会把反馈的内容进行优化之后再输出(机制类似缓存);这个运行速度就会有质的提升,极大的提升运行效率。通过树的遍历得到这个JSON字符串。//休息了 下次再学。

weixin_64132598的博客 631

JavaScript运行机制及事件循环的理解

JavaScript运行机制及事件循环的理解 文章目录JavaScript运行机制及事件循环的理解前言一、JavaScript是单线程1、单线程是什么意思2、javascript为什么是单线程二、任务队列1.任务队列出现的原因2、任务分为同步任务何异步任务三、事件循环四、一道题目总结 前言 本文主要是总结了,JavaScript运行机制,以及事件循环的一些理解,还有一些,收集到的练习题,有兴趣可以联系和巩固一下。 一、JavaScript是单线程 1、单线程是什么意思 单线程,简单的说就是,同一个时间只

qq_43205326的博客 420

javascript运行机制

一年前,我写了一篇《什么是 Event Loop?》,谈了我对Event Loop的理解。 上个月,我偶然看到了Philip Roberts的演讲《Help, I'm stuck in an event-loop》。这才尴尬地发现,自己的理解是错的。我决定重写这个题目,详细、完整、正确地描述JavaScript引擎的内部运行机制。下面就是我的重写。 进入正文之前,插播一条消息。我的新书《ECM

pullgo的博客 544

【javaScript】js运行机制

单线程 同步任务要先于异步任务执行 执行顺序 同步 process.nextTick 异步 setImmediate(第一次事件循环完毕之后就会执行) 下面可以看个例子: 输出的顺序为: 原因如下: 如果此时在零秒定时器前面添加一个for循环同步代码,让这个for循环的运行时间大于0毫秒,那会如何执行呢? 执行结果如下 2000次1的输出运行时间显然大于0毫秒,但是定时器内的代码并没有在f...

qq_53715003的博客 524
上一篇: git 基本使用
下一篇: Vue3 数据通信
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值