Javascript教程十——事件循环机制

深入 JavaScript 执行机制与事件循环 JavaScript 执行机制与事件循环 阅读详情

事件循环机制

事件循环,也就是EventLoop,也就是完成一个任务会需要完成一系列的任务,因此会有一个任务队列,用循环的方式一个个执行,同时执行期间的机制依据着:

同步   >   异步

很好理解,就是同步的任务一定是排着队的一个个从前往后执行,但是异步是会比同步慢一点,这是无可厚非的,但是在异步里面也是要分先后的。

JS单线程

这里我们需要了解,JS是单线程机制程序,所谓单线程,便是同一时间,只能有一个线程任务执行,因为如果存在多个线程,那么页面的加载就完全不受控制了,不知道究竟谁会先出现,为保证页面的顺利进行,必须实行单线程机制。

因为JavaScript是单线程运行的,所有的任务只能在主线程上排队执行,这就是事件循环机制的基础——事件队列。

异步

但是我们不能保证事件队列里面的事件一定可以在合适的时间完成,举个🌰:

如果一个网络请求会去请求网络数据,需要花费20分钟,那么我们的页面要等待20分钟吗,很明显,不可以,这样就会卡住页面,我们需要实行异步,便是这个网络请求需要让出cpu,让事件队列的其他事件先执行,等我请求数据返回再占用cpu,所以这就是JS前端异步的重要,也是必须要实现的。

任务类型

任务类型主要分为两种:宏任务 marco-task 和 微任务 micro-task。
在ES6中,宏任务又称为ScriptJobs,而微任务又称PromiseJobs

宏任务

宏任务在真实性况下有以下几种:

脚本(主程序代码),setTimeout,setInterval,setImmediate

微任务

微型任务的真实包含任务:

async/await,Promises

所以我们可以罗列一下任务执行的顺序:

脚本(主程序)—>Promise...--> setTimeout

举个🌰:

setTimeout(function () {
	console.log(3);
}, 0);

Promise.resolve().then(function () {
	console.log(2);
});
console.log(1);

结果是: 1、2、3
执行顺序:

主程序代码——>Promise——>setTimeOut

再举个🌰:

setTimeout(function(){console.log(1)},0); // 宏任务(排后面)

new Promise(function(resolve,reject){
	console.log(2);  // 它实际上是主程序,根本没有异步
	resolve();
}).then(function(){console.log(3)    // Promise的resolve 异步
}).then(function(){console.log(4)}); // Promise的reject 异步

process.nextTick(function(){console.log(5)});  // process.nextTick 异步

console.log(6);  //  主程序

// 输出2,6,5,3,4,1

主程序代码——>Promise——>setTimeOut

经典案例:

async function async1(){
	console.log('async1 start')
	await async2()
	console.log('async1 end')
}

async function async2(){
	console.log('async2')
}

console.log('script start')

setTimeout(function(){
	console.log('setTimeOut')
}, 0)

async1()

new Promise(function(resolve){
	console.log('promise1') 
	resolve()
}).then(function(){
	console.log('promise2') 
})

console.log('script end')

输出:

// script start
// async1 start
// async2
// promise1
// script end
// async1 end
// promise2
// setTimeOut

JS的防抖与节流

防抖

简单来讲,防抖就是当页面的一个标签被反复触发,只会让最后一次的事件一段时间后生效。

既然涉及到了时间,就需要设置一个计时器,然后计时器延时执行任务:

setTimeOut(function(){
	// 这里是要执行的操作
	func(); //  执行触发函数
}, wait); // wait 是延迟的时间

因为多次点击后,只有最后一次的可以执行,很明显,多次点击后,前面的定时器被清除了,我们来了解一下定时器的清除:

clearTimeout();

所以就是一个定时器如果存在,那么就清除它,然后从头开始一个计时器:

var timer;
if(timer != null){
	clearTimeOut(timer);
}else {
	timer = setTimeOut(function(){
		func(); 
	}, wait); 
}

然后把它们放进一个函数,因为涉及到一个存在问题,可以认为timer是一个全局变量,但是可以利用闭包放进局部变量里面:

function fangdou(func, wait){
	var timer;
	return function TimeMaker(){
		if(timer != null){
			clearTimeOut(timer);
		}else {
			timer = setTimeOut(function(){
				func(); 
			}, wait); 
	}
}

节流

节流和防抖不太一样,如果我们持续点击一个button,那么我们会让button绑定的函数在一个时间段内保证只执行一次,然后此次执行完成后就会开启另外一个时间段来执行下一次的任务,不会执行太多次,但并不是一次。简单来讲一句话,同一时间段,只让第一个操作执行。

因此可以设计一个标签,判断当前时间段有没有定时器在执行,如果有,那么就可以直接返回了,当时没有定时器,那么就可以在这个时间段申请我的事件。

function jieliu(func, wait){
	var timerTag = false;  // 没有占用
	return function TimeMaker(){
		if(timerTag){
			return; // 当前有定时器,这个时间段就不用再执行了
		}else {
			timerTag = true; // 占用这个时间段
			setTimeOut(function(){
				func(); 
				// 执行完成,可以更改标签允许下一个时间段进行任务了
				timerTag = false; // 释放允许占用
			}, wait); 
	}
}
多目标跟踪中使用trackeval评估dancetrack运行结果 trackeval使用 阅读详情

相关推荐

衡山派Luban-Lite系统SDIO无线网络配置实战:以D133CBV-QFN88开发板与RTL8189模组为例

本文详细介绍了在衡山派D133CBV-QFN88开发板上,为Luban-Lite系统配置SDIO无线网络的完整实战流程。通过配置SDMC接口、RTL8189 Wi-Fi驱动、lwIP协议栈及内核参数,并解决编译分区问题,最终实现Wi-Fi网络连接与测试,为嵌入式设备联网提供清晰指导。

weixin_35677363的博客 270

作为一个菜鸟,至今才弄明白前端async、await以及setTimeout的执行顺序

宏任务:macrotask(又称之为宏任务),可以理解是每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)。浏览器为了能够使得 JS 内部 macrotask 与 DOM 任务能够有序的执行,会在一个 macrotask 执行结束后,在下一个 macrotask 执行开始前,对页面进行重新渲染。其中数字代表线程执行遇到的顺序,主线程第一次执行结束后,再次执行微任务队列中的任务,最后执行的是宏任务队列中的任务。下面再通过一个例子去更深次理解宏任务和微任务。

mataodehtml的博客 1802

应急响应-勒索病毒典型处置案例

服务器感染Globelmposter勒索病毒 事件背景 2020年5月,某公司内外服务器遭遇勒索病毒攻击,应急响应工程师在抵达现场后,对包含服务器在内的13太机器进行系统排查和日志分析。 事件处置 勒索病毒初步判定 首先,对其中一台感染勒索病毒的主机A(源地址为192.168.111.129)进行排查,通过勒索信确认为GlobeImposter勒索病毒,如图所示。 在本地桌面及磁盘发现加密文件后缀为.RESERVE,如图所示。 系统排查 主机账号 通过

qq_50765147的博客 2460

js 事件循环执行顺序(setTimeout,async,promise多层嵌套)

我们知道JS是单线程脚步语言,设计为单线程是有好处的,如果为多线程,当两个人同时操作了同一个资源,这样会造成同步问题,不知以谁为准。 同时,单线程也存在一些问题,比如: for(var i = 0;i<1000;i++){ console.log(1) } console.log(2) 结果就是,2将会等待1全部输出完毕后在执行,浪费了大量的时间 我们希望在等待的时间去做别的事,所以...

ZFZ5720 5947

104基于深度学习识别是AI生成还是真实图片

的可视化界面,通过点击左侧可以加载要识别的检测对象图片,点击中间的识别按钮,会识别出结果,识别结果在右侧显示,当前识别的图片是真实的图片,非假图片。有兴趣的小伙伴也可以自行扩充数据集,或训练自己的数据集。文本,分别存放了图片路径和对应的标签。文本里面的数据,并将训练好的模型也保存在本地。即可加载训练好的模型,真假图片进行识别。本期给大家介绍的是基于深度学习识别是。代码整体是非常简便的,总共三个。个文件夹分别是真图和。

xcvxvfgdfgfh的博客 2261

TGK-planner编译报错PLUGINLIB_EXPORT_CLASS解决

TGK-planner编译报错解决。

latter97的博客 857

笔试题(seTimeout async await的执行顺序)

setTimeout(function () { console.log('1') }, 0) console.log('2') async function async1() { console.log('3') await async2() console.log('4') } async function async2() { console.log('5') } async1() async2() console.log('6') 输出结果: ***注意!我就犯了..

m0_60622481的博客 421

如何适配自定义激光雷达数据到LIO-SAM:解决ring和time参数缺失问题

本文详细解析了如何将非标准激光雷达(如速腾、Livox)适配到LIO-SAM框架中,重点解决ring和time参数缺失问题。提供了从源码修改到通用适配中间件的多层级解决方案,并包含实机测试与性能调优指南,帮助开发者高效完成雷达数据适配。

weixin_42551227的博客 421

Promise、async、setTimeout异步执行顺序问题

题目一: console.log('script start'); setTimeout(function() { console.log('setTimeout'); }, 0); const newPromise6 = new Promise(function(resolve, reject) { resolve(console.log('promise1')); }); newPromise6.then(function() { console.log('promise2')

weixin_43933259的博客 1487

dji psdk开发 关于SDK认证芯片的使用

Payload SDK V3.10.0 于 2025-1-8 发布,增加了 Matrice 4T/4E 机型支持,同时也增加了 DJI SDK 认证芯片(DJI SDK CC)功能支持。关于认证芯片的介绍大疆 SDK 认证芯片(DJI SDK Certified Chip),简称 DJI SDK CC,用于认证基于 DJI Eport/Eport-Lite 接口开发的第三方负载设备,确保设备能够正常工作并与无人机可以进行有效通信,起到负载安全认证和功能授权的作用。

热爱生活,忠于自己 2150

【机器学习-18】特征筛选:提升模型性能的关键步骤

我们将介绍不同类型的特征筛选方法,包括基于统计的方法、基于模型的方法和嵌入式方法等,并详细解释每种方法的原理和适用场景。通过特征筛选,我们可以减少数据集的维度,降低模型的复杂度,提高模型的泛化能力,并加速模型的训练过程。通过选择适当的特征筛选方法,我们可以减少模型的复杂度,提高模型的泛化能力,并加速模型的训练过程。然而,并非所有的特征都对模型的性能提升有所贡献,有些特征甚至可能是冗余的、噪声较大的或者与目标变量无关的。我们的目标是通过特征筛选选择出对欺诈检测最有用的特征,以提高模型的预测精度。

qq_38614074的博客 1万+

setTimeout、async、promise 混用的执行顺序

setTimeout、async、promise 混用的执行顺序 async function async1() { console. log("2"); await async2(); console.log("7"); } async function async2() { console.log( '3'); } console.log("1"); setTimeout(function () { console. log("8"); }, 0); async1(); new Pr

weixin_45678402的博客 489

24、汽车黑客技术全解析:诊断代码、车库创建与系统攻防

本文深入探讨了汽车黑客技术的核心内容,包括诊断代码模式与参数ID、创建开放车库社区、汽车系统相关技术、硬件与软件工具、攻击与防御手段,以及车辆通信与网络安全。无论你是汽车安全研究人员、爱好者还是开发者,都能从中获取全面的技术解析与实践指南。

Apple的专栏 228

JS事件循环机制

JS事件循环

weixin_51445423的博客 1万+

深度学习工具包 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")

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

对JavaScript事件循环机制的理解

前言: 这次主要整理一下自己对 Js事件循环机制,同步,异步任务,宏任务,微任务的理解,大概率暂时还有些偏差或者错误。如果有,十分欢迎各位纠正我的错误! 一、事件循环和任务队列产生的原因: 首先,JS是单线程,这样设计也是具有合理性的,试想如果一边进行dom的删除,另一边又进行dom的添加,浏览器该如何处理? 引用: “单线程即任务是串行的,后一个任务需要等待前一个任务的执行,这就可能出现长时间的等待。但由于类似ajax网络请求、setTimeout时间延迟、DOM事件的用户交互等,这些任务并不消

OceanH的博客 9317

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

理解JS的事件循环机制(Event Loop)

JS是单线程语言,但是又可以做到异步处理高并发请求,这时就用到了JavaScript的事件循环机制。

铁锤妹妹的博客 7496

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JS的运行机制——事件循环机制

JavaScript作为单线程语言,其异步处理能力源于浏览器的事件循环机制。浏览器采用多进程架构,其中渲染进程的主线程负责运行JavaScript,同时处理页面渲染和事件响应。为避免阻塞,JavaScript将异步任务(如定时器、网络请求)交由其他线程处理,完成后回调函数被放入任务队列。事件循环不断从队列中取出任务执行,优先处理微任务。这种机制使JavaScript既能单线程运行,又能高效处理并发操作,但同时也带来计时器精度受限、脚本执行会阻塞渲染等特性。理解这些机制对优化Web应用性能至关重要。

不会后端的前端不是一个好全栈 2804

JavaScript 事件循环机制

在浏览器环境中,渲染步骤(样式计算、布局、绘制等)通常发生在宏任务之间,且在所有微任务执行完毕之后。这意味着,如果你想在下一次渲染前操作DOM,应该使用微任务或requestAnimationFrame(用于在下一次浏览器重绘之前执行指定的回调函数。然而,单线程也带来了一个明显的问题:如果某个任务执行时间过长,会导致整个应用"卡住",无法响应用户交互。调用栈是一种LIFO(后进先出)的数据结构,用于跟踪代码的执行位置。微任务优先级高于宏任务,即当前宏任务执行完后,会先清空微任务队列,再执行下一个宏任务。

2302_77437037的博客 2088

谈谈js中的事件循环机制

谈谈js中的事件循环机制本篇文章来讲解js中的事件循环机制

2301_79459824的博客 1916

什么是javascript的事件循环

本篇讲解什么是javascript的事件循环,事件循环的运行机制和执行顺序,理解事件循环对于编写高效、流畅的 JavaScript 代码至关重要。

Sherry Tian的博客 1975

深入剖析javascript的事件循环机制 Event loop

如何js事件循环 是当前各大公司问的非常频繁的一个问题。很多人估计大概知道js事件循环是个什么东西,单可能在脑子里的概念又比较模糊,无法深入的理清楚。那么事件循环到底是个什么东西。今天我们来好好了解一下。

weixin_42707287的博客 2857

JavaScript | 事件循环机制

JavaScript 是一种单线程语言,依赖于 事件循环机制 (简称 Event Loop),完成对同步和异步任务的处理,从而实现非阻塞并发。这里将从基础概念到实际例子,进一步解释事件循环的运作机制。

2502_90366796的博客 1342

带你梳理JS的事件循环机制

事件循环是为了而出现的。首先,我们要理解JavaScript是一门语言。

a270912508的博客 1789

JS的事件循环机制

JS的事件循环机制 事件执行的顺序 当事件开始时,首先会进入JS主线程机制,由于JS属于单线程机制,因此存在多个任务的时候会存在等待的情况,先等待最先进入线程的事件处理完毕 这样就会出现等待的情况,如果之前的事件没有执行完成,后面的事件就会一直等待 但是类似于AJAX和setTimeout , setInterval 等待的事件,就出现了异步处理 通过将异步的事件交给异步模块处理,主线程就会去并行的处理后面的事件 当主线程空闲的时候,异步处理完成,主线程就会读取异步处理返回的callba

小火车况且况且况且的博客 1215

JS事件循环

JS 引擎是单线程的,直白来说就是一个时间点下 JS 引擎只能去做一件事情,而 Java 这种多线程语言,可以同时做几件事情。JS 做的任务分为同步和异步两种,所谓 “异步”,简单说就是一个任务不是连续完成的,先执行第一段,等做好了准备,再回过头执行第二段,第二段也被叫做回调;同步则是连贯完成的。像读取文件、网络请求这种任务属于异步任务:花费时间很长,但中间的操作不需要 JS 引擎自己完成,它只用等别人准备好了,把数据给他,他再继续执行回调部分。如果没有特殊处理,JS 引擎在执行异步任务时,应该是存在等待的

weixin_45730243的博客 8214

JavaScript 事件循环机制(Event Loop)简述

JavaScript 是浏览器的脚本语言。其主要作用是与客户端进行交互。最开始设计之初它就是单线程。因为它主要操作 DOM。如果设计成多线程,假设一个线程在操作某个 DOM 节点,一个线程又在删除这个 DOM 节点。这时候浏览器就无法判断以哪个线程为主,这种复杂的场景大大增加了语言的难度。所以 JavaScript 从一诞生就是单线程。也是它最重要的特性之一。

杏子 1万+
上一篇: Javascript教程九——BOM
下一篇: Javascript教程十————DOM
ruby___ruby
博客等级 码龄9年 2粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值