首页 > 编程语言 >javascript编程单线程之同步模式

javascript编程单线程之同步模式

时间:2022-10-25 00:22:20浏览次数:45  
标签:编程 单线程 javascript 模式 js 任务 同步 执行

javascript编程单线程之同步模式

主流的js 环境都是单线程吗模式执行js 代码, js采用为单线程的原因与最开始设计初衷有关,最早是运行在浏览器端的脚本语言,目的是为了实现页面上的动态交互,实现页面交互的核心就是dom操作,这也就决定了js必须使用单线程的模式来处理,不然就会造成严重的线程同步问题。如果js多个线程同时修改dom元素,此时浏览器就无法明确以那个线程的结果为准,为了避免这种线程同步问题,所以从一开始js就被设置成了单线程模式工作。这里所说的单线程指的是javascript执行环境中负责执行代码的线程只有一个

可以想象成只有一个人来执行任务,一个人一次只能执行一个任务,如果有多个任务就需要排队依次去完成。这种模式最大的优点是更安全更简单,缺点也很明显,遇到某一个特别耗时的任务后面的任务就需要等这个任务的结束,这也就导致整个程序的执行的拖延,出现假死的情况。

  • 优点:更安全、更简单
  • 耗时任务会出现程序假死的情况

为了结局耗时任务的问题,javscript 把 任务的执行分了两种模式,分别是

  • 同步模式(Synchoronous)
  • 异步模式(Asynchronous)

js.exec

同步模式Synchoronous

代码依次执行,后一个任务要等待前一个任务执行完成,同步执行比较简单,代码的执行顺序就是代码的顺序。单线程大部分都是同步模式。

Console 是输出的打印,Call stack 是执行栈

开始执行 js 会把我们的整体的代码加载进来并放到一个匿名函数里面执行,然后逐行开始执行,

第一行 执行会把 console.log('global begin') 压入调用栈中,控制台打印global begin 执行结束,弹出调用栈

接下来是两个函数的声明,函数的声明不会产生调用所以接着往下执行

接下来是一个foo 函数的调用,会把 foo压入调用栈,foo 函数打印了一个消息,接着执行了 bar 函数,bar 函数也会被放入执行栈中,bar函数执行过程中又打印了一次,bar执行完毕弹出调用栈,紧接着 foo 函数也执行结束,弹出调用栈

最后打印了一个消息,也是一样的压栈,整体代码执行完,执行栈就会被清空掉

js.aync.exec

这种排队执行的机制下某行代码执行时间过长,后面的任务就会被延迟。我们把这种延迟称为阻塞,这种阻塞对于用户而言会有页面卡顿或者叫卡死,所以需要异步模式来解决程序中无法避免的耗时操作,比如ajax操作,或者nodejs中的大文件读写

更多内容微信公众号搜索充饥的泡饭
小程序搜一搜开水泡饭的博客

标签:编程,单线程,javascript,模式,js,任务,同步,执行
From: https://www.cnblogs.com/fengbaba/p/16823557.html

相关文章

  • 编程风格
    编程风格let取代var尽量使用const(全局特别如此)静态字符串不用双引号,使用单引号或者反引号。使用数组对变量赋值或使用对象或函数返回多个值时,使用解构赋值,如:con......
  • 并发编程之线程池
    线程池为什么需要线程池?如果性能允许的话,我们完全可以在for循环代码起很多的线程去帮我们执行任务,代码如下publicclassManyThread{publicstaticvoidmain(S......
  • JavaScript的async/await
    ES6入门教程-阮一峰:async函数1.async函数介绍ES2017新规中引入了async函数,async函数其实就是Generator函数的语法糖,只是省去了next方法递归的过程。async......
  • 为什么你需要R语言、Python、MATLAB、SAS代写代做编程assignment指导帮助?
    全文链接:tecdat.cn/?p=29638 为什么你需要编程assignment指导帮助?计算机编程一直都不是一个简单的领域,即使是对于那些痴迷于计算机编程的同学,乃至大神们,也很难掌握所有......
  • JavaScript学习--History&Location对象
    History:历史记录获取:window.history.方法();window可省略方法:back()加载history列表的前一个urlforward()加载history列表的下一个url Location:地址栏对象获取win......
  • C++编程笔记(QT)
    目录入门基础模态对话框消息提示框(messagebox)文件和目录字体选择框输入对话框进度条工具栏控件布局Windows托盘案例控件button下拉菜单按钮`radioButton`单选按钮......
  • shell编程之函数,递归
    函数定义函数格式一:function函数名{命令序列}格式二:函数名(){命令序列}#####main#####可以直接在主代码区直接使用函数名调用函数   删除函数格式:u......
  • 面试题JavaScript基础
    原博客地址01.如何开启js严格模式?js严格模式有什么特点?参考点:js基础知识参考答案://全局开启'usestcict'//局部开启functionfu(){'usestrict'}/*1......
  • 常见的JavaScript的循环处理数据方法
    1.for循环letarr=[1,2,3];for(leti=0;i<arr.length;i++){ console.log(i,arr[i])}//01    //12   //232.forin循环letobj={name:'zhou......
  • SYSU-SSE 3D游戏编程与设计 学习笔记(2)--空间与运动
    前言中山大学软件工程学院3D游戏编程与设计课程学习记录博客游戏代码:游戏代码简答题游戏对象运动的本质是什么游戏对象的运动过程本质上就是游戏对象transform......