javascript编程单线程之同步模式主流的js
环境都是单线程吗模式执行js 代码,js
采用为单线程的原因与最开始设计初衷有关,最早是运行在浏览器端的脚本语言 , 目的是为了实现页面上的动态交互,实现页面交互的核心就是dom
操作,这也就决定了js
必须使用单线程的模式来处理 , 不然就会造成严重的线程同步问题 。如果js
多个线程同时修改dom
元素,此时浏览器就无法明确以那个线程的结果为准,为了避免这种线程同步问题 , 所以从一开始js就被设置成了单线程模式工作 。这里所说的单线程指的是javascript执行环境中负责执行代码的线程只有一个
。
可以想象成只有一个人来执行任务,一个人一次只能执行一个任务 , 如果有多个任务就需要排队依次去完成 。这种模式最大的优点是更安全更简单,缺点也很明显 , 遇到某一个特别耗时的任务后面的任务就需要等这个任务的结束,这也就导致整个程序的执行的拖延 , 出现假死的情况 。
- 优点:更安全、更简单
- 耗时任务会出现程序假死的情况
javscript
把 任务的执行分了两种模式 , 分别是- 同步模式(
Synchoronous
) - 异步模式(
Asynchronous
)
文章插图
同步模式
Synchoronous
代码依次执行,后一个任务要等待前一个任务执行完成,同步执行比较简单,代码的执行顺序就是代码的顺序 。单线程大部分都是同步模式 。Console
是输出的打?。?code>Call stack 是执行栈开始执行 js 会把我们的整体的代码加载进来并放到一个匿名函数里面执行,然后逐行开始执行,
第一行 执行会把
console.log('global begin')
压入调用栈中,控制台打印global begin
执行结束,弹出调用栈接下来是两个函数的声明 , 函数的声明不会产生调用所以接着往下执行
接下来是一个
foo
函数的调用,会把 foo
压入调用栈,foo
函数打印了一个消息 , 接着执行了 bar
函数,bar
函数也会被放入执行栈中,bar
函数执行过程中又打印了一次 , bar
执行完毕弹出调用栈,紧接着 foo
函数也执行结束,弹出调用栈最后打印了一个消息 , 也是一样的压栈,整体代码执行完,执行栈就会被清空掉
文章插图
【javascript编程单线程之同步模式】这种排队执行的机制下某行代码执行时间过长 , 后面的任务就会被延迟 。我们把这种延迟称为阻塞,这种阻塞对于用户而言会有页面卡顿或者叫卡死 , 所以需要异步模式来解决程序中无法避免的耗时操作,比如
ajax
操作,或者nodejs
中的大文件读写更多内容微信公众号搜索充饥的泡饭
小程序搜一搜开水泡饭的博客
推荐阅读
- python渗透测试入门——基础的网络编程工具
- JavaScript函数式编程之函子
- 学习ASP.NET Core Blazor编程系列八——数据校验
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
- 手写编程语言-如何为 GScript 编写标准库
- 原生JavaScript
- 上 学习ASP.NET Core Blazor编程系列六——新增图书
- subprocess Python编程之子进程管理详解
- StampedLock:一个并发编程中非常重要的票据锁
- Punched Card 编程架构演化史:远古时代,从打孔卡开始