zoukankan      html  css  js  c++  java
  • javascript异步的一些理解

    最近最javascript的异步有一些认识,分享给各位同道~

    首先来一句概括的总论:在javascript中,除了首次执行的js属于同步代码是同步之外,其他的一切都是异步的。

    一个最最基础的事实:浏览器是多进程的,每个页面就是一个进程,每个进程包括许多的线程如 JavaScript 引擎线程,GUI线程,事件触发线程,http请求线程,时间轮询线程,js解释器是单线程的。JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序,这意味这页面上的所有代码都可以公用全局上下文。

    说到线程,那就不得不说说进程。在知乎上面有一篇关于进程和线程的区别的帖子写的非常不错,有一句话很基础也让人印象深刻 --- 进程和线程都是一个时间段的描述,是CPU工作时间段的描述。(这里引用一下,有兴趣的可以去了解解一下)。

    javascript是单线程的,相信你从接触这个javascript开始就接受了这个概念,但是单有这个概念你是很难去理解javascript 的异步的,甚至会有一些疑惑,既然js 是单线程的?那么为什么可以去计时,为什么可以去做ajax请求,webworker等概念都会让你觉得why?js不是单线程的吗?这些是怎么实现的?

    javascript异步的实现:本质上还是借助于多线程的宿主实现的,并发 Javascript 语言本身特性。其背后实现具体依靠事件循环如果你有linux 的学习经验的话,你可以把它想象成js的解析类比成管道,js在介绍的时候总是从管道的后端加入一些信息,这些信息包括作用域,变量等。在解析执行就是在这个管道中进行。完成之后就自动会进行下一个等待的task(如果有任务在等待执行的话)。这些个task从何而来?因为浏览是多线程的,有些线程会去协调其他线程比如js线程,事件触发线程,定时线程。这些线程会把事件触发线程的触发的事件推给js线程进行js的task。

    明白这些我们能实现什么呢下面举个例子

      在 javascript我们通过某个事件的回调去给兼听window的事件去处理某些需求,比如说scroll事件,同时有需求需要在一定的滚动距离内实现某些状态的更改和调用的scrollTo dom api。在调用scrollTo的api中,我们会触发一次scroll事件。。。

    欢迎交流,指正~

    参考博客:从event loop规范探究javaScript异步及浏览器更新渲染时机

  • 相关阅读:
    Application的使用(使用,及要注意的内存泄露问题)
    ANDROID 2.3 HOTPLUG input设备event处理以及hotplug检测
    博客园随笔添加自己的版权信息
    还贷的那些事III——等额还贷的计算
    计算机中的颜色IX——总述:RGB和HSV快速转换
    还贷的那些事II——等本还贷的计算
    计算机中的颜色VII——快速计算纯色的偏转
    还贷的那些事I——还贷的基本概念
    计算机中的颜色VIII——快速计算颜色的偏转
    计算字符串的相似度(VB2005)
  • 原文地址:https://www.cnblogs.com/www-wwr/p/8635737.html
Copyright © 2011-2022 走看看