JS执行机制

简介: JS是单线程JS是单线程的,也就是说JS代码是按顺序执行的,一行一行执行的,不会出现同时执行多行代码的情况。也就是JavaScript同一时间内只能做一件事情,如果有多个任务,就必须排队,前一个任务结束,才能执行后一个任务。(比如我们对某个DOM元素进行添加删除操作室,不同同时进行,要按照顺序执行)

JS的执行机制

JS是单线程

JS是单线程的,也就是说JS代码是按顺序执行的,一行一行执行的,不会出现同时执行多行代码的情况。

也就是JavaScript同一时间内只能做一件事情,如果有多个任务,就必须排队,前一个任务结束,才能执行后一个任务。(比如我们对某个DOM元素进行添加删除操作室,不同同时进行,要按照顺序执行)

这样就会导致一个问题:如果js执行时间过长,就会给用户一种页面加载很慢的感觉(页面渲染不连贯,页面加载阻塞)。

为了解决这样一个问题,HTML5提出了Web Worker标准,允许JavaScript脚本创建多个线程,于是出现了JS的同步和异步。

同步

同步就是按照顺序执行,前一个任务结束,才能执行后一个任务。

程序执行的顺序与代码的顺序是一致的、同步的。

同步任务都放在主线程上执行,形成了一个执行栈

console.log('1');
    setTimeout(function(){
        console.log('2');
    },0);
    console.log('3');
复制代码

在上面的代码中,同步任务有:

同步任务
console.log('1');
setTimeout(function(),0);
console.log('3');

其中setTimeout里面的函数异步任务,它会在主线程上执行完同步任务后,将异步任务放到任务队列中,等待主线程空闲后,再执行。

异步

异步就是不按照顺序执行,前一个任务结束,不一定要执行后一个任务。

JavaScript的异步是通过回调函数来实现的。

异步任务我们放在任务队列(消息队列)里面。

常见的异步任务有以下三类:

  • 普通事件:比如click、scroll、mousemove等
  • 资源加载:比如图片加载、音频加载、文件加载等
  • 定时器:比如setTimeout、setInterval等

二者的本质区别就是在程序在条流水线上各个流程的执行顺序不同。

执行机制

  1. 先执行执行栈里面的同步任务
  2. 如果遇到异步任务,就将异步任务放到任务队列中。继续执行下面的同步任务。
  3. 当执行栈里面的同步任务执行完毕,就会将任务队列里面的异步任务按照次序放到执行栈中执行。

在主线程将异步任务添加到任务队列的过程中,有一个异步进程处理,当带有异步任务的同步任务执行完毕之后才会添加到任务队列中。

当主线程执行完毕之后,会去任务队列中取出异步任务,放到执行栈中执行。去任务队列获取异步任务的这个过程,会一次又一次的执行。

也就是主线程不断的重复获得任务、执行任务、再获取任务、在执行任务、、、,这种机制就被成为事件循环


相关文章
|
4月前
|
前端开发 JavaScript UED
深入理解JavaScript中的事件循环机制
JavaScript中的事件循环机制是其异步编程的核心,深入理解该机制对于开发高效、流畅的前端应用至关重要。本文将介绍事件循环的工作原理、常见的事件循环模型,以及如何利用这些知识解决前端开发中的常见问题。
|
28天前
|
JavaScript 前端开发 算法
js 内存回收机制
【8月更文挑战第23天】js 内存回收机制
30 3
|
28天前
|
存储 JavaScript 前端开发
学习JavaScript 内存机制
【8月更文挑战第23天】学习JavaScript 内存机制
22 3
|
19天前
|
JavaScript 中间件 开发者
深入浅出Node.js中间件机制
【8月更文挑战第31天】本文将带你领略Node.js中间件的奥秘,通过直观的案例分析,揭示其背后的设计哲学。你将学会如何运用中间件构建强大而灵活的后端应用,以及在面对复杂业务逻辑时如何保持代码的清晰与高效。
|
19天前
|
设计模式 JavaScript 中间件
深入浅出Node.js中间件机制
【8月更文挑战第31天】在Node.js的世界里,中间件如同魔法般存在,它让复杂的请求处理变得井然有序。本文将带你领略中间件的奥秘,从原理到实战,一步步揭开它的神秘面纱。你将学会如何运用中间件来构建强大而灵活的后端应用,就像拼乐高一样有趣。
|
3月前
|
设计模式 JavaScript 前端开发
【JavaScript】深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略
JavaScript的继承机制基于原型链,它定义了对象属性和方法的查找规则。每个对象都有一个原型,通过原型链,对象能访问到构造函数原型上的方法。例如`Animal.prototype`上的`speak`方法可被`Animal`实例访问。原型链的尽头是`Object.prototype`,其`[[Prototype]]`为`null`。继承方式包括原型链继承(通过`Object.create`)、构造函数继承(使用`call`或`apply`)和组合继承(结合两者)。ES6的`class`语法是语法糖,但底层仍基于原型。继承选择应根据需求,理解原型链原理对JavaScript面向对象编程至关重要
76 7
【JavaScript】深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略
|
2月前
|
JavaScript 前端开发 API
js 运行机制(含异步机制、同步任务、异步任务、宏任务、微任务、Event Loop)
js 运行机制(含异步机制、同步任务、异步任务、宏任务、微任务、Event Loop)
29 0
|
4月前
|
缓存 移动开发 JavaScript
WKWebView对网页和js,css,png等资源文件的缓存机制及如何刷新缓存
WKWebView对网页和js,css,png等资源文件的缓存机制及如何刷新缓存
156 1
|
3月前
|
JavaScript 前端开发
深入解析JavaScript中的面向对象编程,包括对象的基本概念、创建对象的方法、继承机制以及面向对象编程的优势
【6月更文挑战第12天】本文探讨JavaScript中的面向对象编程,解释了对象的基本概念,如属性和方法,以及基于原型的结构。介绍了创建对象的四种方法:字面量、构造函数、Object.create()和ES6的class关键字。还阐述了继承机制,包括原型链和ES6的class继承,并强调了面向对象编程的代码复用和模块化优势。
41 0