JS的同步与异步编程

本文探讨了JavaScript的同步与异步编程,包括JS单线程的原因、同步任务与异步任务的区别、Event Loop机制、定时器以及常见的异步编程模式如回调函数、事件监听和Promise对象。通过理解这些概念,有助于提升前端开发中的性能优化和用户体验。
摘要由CSDN通过智能技术生成

JS同步与异步编程

在前端入坑近一年后,才着手写自己的第一篇博客,似乎有点晚
这篇博客只是记录了在前端学习中对JS同步与异步编程的一些看法与理解,写的可能不好,如果有错误或者需要改进的,抑或是某些文字不小心侵权的时候希望大家指出。

JS是单线程的

要了解JS的同步与异步编程,那就要先了解JavaScript这门语言的语言特性。
JS是一门解释型的脚本语言,是单线程的。但是随着计算机的发展cpu的计算性能越来越强大,为什么不把JS设计成多线程的来提高运行效率呢?为什么JS一定要是单线程的呢?这其中有以下几个原因:

  • JS的用途
    个人觉得将JS设计成单线程最大的原因取决于它的用途。
    JS是负责与用户接触与操作DOM元素的,就和java操作GUI也是单线程一样,若是多个线程同时操作一个dom元素,将会带来很严复杂的线程同步问题。
    比如一个线程将要删除这个dom元素,但是另一个元素需要修改这个dom元素,这将产生复杂的问题,所以这注定JS必须只能设计成单线程的。
  • 多线程对JS的影响
    虽然可以为JS引入“锁”的概念来解决线程同步的问题,但这会大大的增加编程的复杂度。
    JS是一门解释型的语言,如果设计成多线程,JS引擎将要兼顾线程调度并保证线程安全,这将大大增加JS引擎的压力。
  • 个人猜想
    JS最初的设计目的仅仅是为了替服务器分担数据验证的压力,在前端进行表单数据验证,对JS的性能要求不高。但是可能当时的设计者也没有想到JS将来会发展到与用户进行复杂的交互,并且逐渐的运行环境也不仅仅局限于浏览器,比如服务端的Node.js或是在物联网中的应用。所以当时设计JS是单线程的。

同步与异步任务

JS是单线程的,意味着在同一时间只能处理一项任务,所有的任务都是排队执行,后面的任务需要等前面的任务执行完成后才能执行。这样将带来一个问题,当某个任务耗费大量时间的时候将会长时间阻塞后续任务的实行,这将使页面假死,极大的降低用户体验。例如Ajax,在我们发送请求到得到回应的这段时间里,系统一直处于等待的状态,这对计算机资源是很大的浪费。
所以为了能够利用计算机多核运算的能力,某些耗时的任务在执行时我们完全没有必要去等待,而是可以将它们挂起,知道得到结果后再继续执行后续的操作,也就是“回调函数”。
于是任务就有了同步任务与异步任务。
当主线程运行的时候,大概有以下几个步骤:

  • 所有的同步任务在主线程中排队执行,形成一个“执行栈”;
  • 异步任务则被挂起,每个异步任务都会指定一个回调函数;当异步任务返回结果后,会在“任务队列”中放置一个回调函数。
  • 当主线程空闲的时候就会读取“任务队列”中的函数,任务队列中的函数则进入“执行栈”并执行。
  • 主线程循环执行以上三步。

异步任务的执行过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值