宝哥软件园

js前端面试同步和异步问题详解

编辑:宝哥软件园 来源:互联网 时间:2021-08-26

前言

本来打算写一篇co源码精读(为什么读co,因为短),但是Goose发现有一系列基础问题没有理解透彻,打算写一篇js基础系列文章,总结一下自己的理解(文案),希望在学习的道路上和大家一起进步。首先问问自己,当面试官问到js中的同步和异步时,这个问题怎么回答?理解一个问题无非是什么-为什么-怎么做

js同步和异步的问题是什么——为什么会出现异步问题——以及如何解决它们?

一、JavaScript的起源

技术的出现与应用场景息息相关。JavaScript诞生于1995年。当时,它的主要目的是处理一些以前由服务器端语言(如Perl)承担的输入验证操作。在JavaScript出现之前,表单数据必须发送到服务器,以确定用户是否没有填写必填字段或输入了无效值。网景航海家希望通过JavaScript解决这个问题。最初名为livescript,但后来网景公司与孙公司结成了开发联盟。网景为了赶上媒体对Java的热情,暂时把LiveScript的名字改成了JavaScript,所以JavaScript本质上与Java无关。

如今,JavaScript的使用不再局限于简单的数据验证,而是具有与浏览器窗口及其内容等几乎所有方面进行交互的能力。如今,JavaScript已经成为一种功能齐全的编程语言

总结:js最初的目的是实现用户和浏览器之间的交互

二、JS为什么是单线程的?

JavaScript的单线程与其用途有关。作为一种浏览器脚本语言,JavaScript主要用于与用户交互和操作DOM。这就决定了它只能是单线程,否则会带来复杂的同步问题。例如,假设JavaScript同时有两个线程,一个线程向DOM节点添加内容,另一个线程删除节点。浏览器应该以哪个线程为标准?

因此,为了避免复杂性,JavaScript从诞生之日起就一直是单线程的,这已经成为这种语言的核心特性,未来也不会改变。

注意:单线程意味着JS引擎中只有一个线程负责解释和执行JavaScript代码。

三、计算机同步和异步(关键)

计算机领域的同步和Synchronous的概念和我们生活中的正好相反,感觉翻译得背锅。生活中的同步突出‘相同’,相同的步调意味着我们一起行动,比如一起逛街,一起吃饭,一起睡觉。异步就是你忙你的,我忙我的,不同步,不互相干扰。很难知道计算机中的同步和异步不是这样的。真的不是。

电脑同步就像:在国外上学,人生地不熟,突然生活费不够了;这时,你决定打电话回家,通知家人给你转生活费。然而,当你打电话时,对方总是在等待接听(即我打不通,联系不上)。为了拿到生活费,你不停的打电话等待,最终可能无法及时拿到生活费,导致今天要做的事情没有完成,浪费了时间。电脑的异步性是:当你发现没人接电话时,猜测:对方可能很忙,暂时不能接电话,所以你发短信(或语音留言,或其他方式)通知对方后,你在忙其他重要的事情;这时,你不需要不断地打电话,但你可以做其他事情;一定时间后,对方看到你的消息后会回复你。当然,对方可能转账,也可能不转账。但是说到底,你做了很多事情。或者你临时向室友借了一笔钱,又开始了快乐的学校时光。

总结:电脑同步就是排队。如果你是第101个备胎,你只能‘对付’你之前的一百个爆胎。异步意味着即使你是第101个,她仍然可以照顾你的感受。

4.为什么js单线程有“异步”问题

看完前面的准备,你会有这些问题吗?JS是单线程的,那么如何实现异步操作呢?AJAX异步发送和回调请求,setTimeout看起来也是多线程的?慢慢来。

js是否同步?是,单线程,那么只能同步执行(排队)

为什么js需要异步?如果JS中没有异步,只能从上到下执行。如果前一行需要很长时间来解析,下面的代码将被阻塞。

对于用户来说,阻塞意味着“卡住”,这会导致用户体验不佳

js单线程如何异步?通过事件循环实现“异步”

经典问题:

console . log(' 1 ')setTimeout(function(){ console . log(' 2 ')},0) console.log ('3')//1,3,2也就是说,setTimeout中的函数不会立即执行,而是延迟一段时间,只有在满足某些条件后才会执行。

因此,这里我们首先知道JS中的一种分类方法,就是将任务分为:同步任务和异步任务

虽然JS是单线程的,但是浏览器内核是多线程的。在浏览器内核中,不同的异步操作由不同的浏览器内核模块调度和执行,异步操作会给任务队列添加相关的回调。不同的异步操作在不同的时间被添加到任务队列中,例如onclick、settimeout和Ajax。这些异步操作由浏览器内核的webcore执行,在上图中包含三种webAPI,分别是DOM Binding、网络和定时器模块。

按照这个分类,JS的执行机制是

首先判断js代码是同步还是异步。如果同步,将进入主进程,如果异步,将进入事件表。当满足触发条件时,推入事件队列的同步任务将在进入主线程后继续执行。在主线程空闲之前,它将进入事件队列查看是否有任何可执行的异步任务。如果是,将被推入主进程,在上述三个步骤中执行,这就是事件循环

总结:同步可以保证顺序一致,但容易造成阻塞;异步可以解决阻塞问题,但它会根据不同的需求改变顺序和编写代码。

每周都会持续更新。您对三网融合的点赞、收藏和关注是我的动力。

当你决定前进的道路时,不要总是回头看,和平的爱。

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。谢谢你的支持。

更多资讯
游戏推荐
更多+