浅谈js运行机制
前言
因为js的运行机制十分重要,理解起来也十分抽象,仍还是在这里做个记录,加深自己的记忆。
总之,希望本文的内容能够对您的学习或者工作有所帮助。另,如果有任何的错误或者不足请指正!
如何理解js单线程
用大白话来讲,就是同一个时间只能做一件事
什么是任务队列
console.log(1)
setTimeout(()=>{
console.log(3)
},0)
console.log(2)
首先我们看下上面的代码,大家猜一下输出的是什么呢?
如果你回答的是 1 2 3,那么恭喜你,答对了,我们说说为什么他输出的是123呢,明明我的setTimeout设置为0了啊
这里我们可以引申出一个新的概念,js的任务队列
js的任务队列:因为js是单线程的,所以同一个时间只能做一件事,当js遇到异步任务的时候要先把异步任务挂起,js往后继续执行,同步任务执行完毕,然后再执行异步任务
ps:据说HTML5标准规定
setTimeout的最短时间间隔是4毫秒
setInterval的最短间隔时间是10毫秒,也就是说,小于10毫秒的时间间隔会被调整到10毫秒
什么是事件循环(Event Loop)
for(var i = 0;i<4;i++){
setTimeout(()=>{
console.log(i)
},1000)
}
这里输入的又是什么呢?先说答案,4个4
从上面可知道,同步任务执行就会执行任务队列了。那么,执行到了异步任务就一定会放到任务队列吗?其实不然。
浏览器中有个定时器模块,只有当时间到了才会把setTimeout放到异步队列中。
所以for循环在执行的过程中,并没有把setTimeout真正的放到异步队列中,异步队列中没有东西,只有当时间到了,才会把他扔到异步队列中,异步队列再等待一个叫事件循环的东西来执行。
上面说到了事件循环,那他到底是什么呢?
事件循环:
所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
主线程不断重复上面的第三步。
异步任务有哪些
setTimeout和setInterval
DOM事件
AJAX
Promise
浅谈js运行机制的更多相关文章
- 从setTimeout谈js运行机制
众所周知,JavaScript是单线程的编程,什么是单线程,就是说同一时间JavaScript只能执行一段代码,如果这段代码要执行很长时间,那么之后的代码只能尽情地等待它执行完才能有机会执行,不像人一 ...
- 浅谈js执行机制
关于js执行机制,老早之前就一直想写篇文章做个总结,因为和js执行顺序的面试题碰到的特别多,每次碰到总是会去网上查,没有系统地总结,搞得每次碰到都是似懂非懂的感觉,这篇文章就系统的总结一下js执行机制 ...
- 浅谈 js 字符串 search 方法
原文:浅谈 js 字符串 search 方法 这是一个很久以前的事情了,好像是安心兄弟在学习js的时候做的练习.具体记不清了,今天就来简单分析下 search 究竟是什么用的. 从字面意思理解,一个是 ...
- 从浏览器多进程到JS单线程,JS运行机制的一次系统梳理
前言 见解有限,如有描述不当之处,请帮忙及时指出,如有错误,会及时修正. ----------超长文+多图预警,需要花费不少时间.---------- 如果看完本文后,还对进程线程傻傻分不清,不清楚浏 ...
- 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理
前言 来源:https://dailc.github.io/2018/01/21/js_singlethread_eventloop.html 见解有限,如有描述不当之处,请帮忙及时指出,如有错误,会 ...
- 浅谈JS严格模式
浅谈JS严格模式 简介 何为严格模式?严格模式(strict mode)即在严格的条件下运行,在严格模式下,很多正常情况下不会报错的问题语句,将会报错并阻止运行. 但是,严格模式可以显著提高代码的健壮 ...
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
浅谈JS中的!=.== .!==.===的用法和区别 var num = 1; var str = '1'; var test = 1; test == num //tr ...
- 浅谈JS中 var let const 变量声明
浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...
- 浅谈JS之AJAX
0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HT ...
随机推荐
- tp5.1 nginx环境下url去掉index.php
原来的地址http://xxxxxxx/index.php/admin/login/index.html 修改完的路径http://xxxxxxx/admin/login/index.html 修改. ...
- 还不会K8S吗?先从kubeadm开始吧
目录 1. 准备工作 1.1 机器准备 1.2 系统配置 1.2.1 主机名及域名解析 1.2.2 免密登录 1.2.3 配置yum源 1.2.4 安装必要依赖包 1.2.5 关闭防火墙.SELinu ...
- 【Mac】屏蔽系统升级更新
三行代码解决Mac升级弹窗,小红点数字1
- PHP关于syntax error语法错误的问题(Parse error: syntax error, unexpected end of file in xxxxxxxx)
在php程序出现类似 Parse error: syntax error, unexpected end of file in xxxxxxxx on line xx 的错误. 如图 如果发现php ...
- Longest Mountain in Array 数组中的最长山脉
我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”: B.length >= 3 存在 0 < i < B.length - 1 使得 B[0] < B[1] ...
- 继承性与super的使用练习
练习1: Account: package com.aff.sup; public class Account { private int id;// 账号 private double balanc ...
- (易忘篇)java基本语法难点1
switch后面使用的表达式可以是哪些数据类型 byte.short.char.int.枚举类型变量.String类型. 如何从控制台获取String和int型的变量,并输出 // 以下只关注重要点的 ...
- vc程序设计--图形输出3
// 实验2.cpp : 定义应用程序的入口点. // #include "framework.h" #include "实验2.h" #define MAX_ ...
- remote desktop能实现什么?远程桌面管理的意义是什么?
随着互联网时代的发展,向人请教来说,视频教学已经不算便捷了,而远程桌面就发挥了重要作用.它意味着您可以从家里连接到工作计算机,并访问所有应用程序.文件和网络资源,好像正坐在工作计算机前面.您可以让程序 ...
- DFA最小化
1.将DFA最小化:教材P65 第9题 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→0S|0 3.自上而下语法分析,回溯产生的原因是什么? 文法中,对于某个非终结符号的规 ...