javascript运行环境和机制的介绍
来源:才华咖 本文已影响3.12W人
来源:才华咖 本文已影响3.12W人
搞了那么久的前端,从开始用jquery快速写一些效果,还有一些类似于kissy的框架等等,这些东西,通过模块的规范,加载的机制,还有api的封装,可以快速的实现一些效果,开发一些应用,以及后面流行下来的是声明是渲染,函数式编程。
可是,底层的JavaScript的运行机制,没有怎么了解过,我们来看看。 JavaScript的运行机制里面,非阻塞,单线程的机制,是不是。。
下图所示(也许这个图可以重新花一遍):
stack 栈
栈,push push push 然后pop pop pop 好了,一个先进后出的数据模型,在js里面,有这么一个stack,我们用一个函数call它出来看看。
这个函数的意思是,callstack函数,内部return 然后调用他本身,运行下来,应该是,一直调用,往下走,好了,很明显,计算机不是无穷的,给stack最大长度设了限制,然后,触达了最大的调用限制,v8 print到window上面来了。过程大概是这样的,如下图:
再比如,JavaScript的链式作用于,作用于或者函数之间的调用,如下所示:
这样的话,看起来,过程是这样的,进栈的顺序是 c b a ,然后,从a开始return。
非阻塞(no-blocking)方案
接着上面的栈来讲,v8会把运行时里面的函数推到栈里面去,然后一个个的去执行。 首先,计算机系统里面,你拿资源是耗时间的,但是,你去拿raw,很快,几乎不用等,你去拿硬盘数据,可能稍微慢一点,但是也还可以,你去拿网络数据,发起请求,就很慢了,所以,如果函数中有长时间的等待过程,如果是blocking的,而js是单线程的,所以,你只能一次做一件事情。
不知大家是否有影响,一些写的非常不好代码,页面里面声明了一些按钮,一些操作,然后,因为js还在运行,导致了你的操作滞后了,浏览器记住了你的`操作,然后,后面一个一个的执行了出来。
还有就是电脑非常落后的时候,cpu很慢的时候,也要类似的现象。所以,这个时候,浏览器其实是在做什么呢? 浏览器其实是一次可以完成非常多的工作,只是隐藏了一些你所不知道的细节在里面。
下面我们来介绍这个单线程,但是一次性可以做非常多工作的模型。
js的运行栈里面,我们一个工程上,往栈里面压函数,然后执行,返回,下一个,这样的节奏。而这个时候,如果是一个异步的网络请求,会发生什么呢?
执行栈里面,其实很快就可以继续下一个函数的操作,为什么?为什么非阻塞,因为有另外的模型,在处理等待,也即是callback咯。callback底层有是怎么做的呢?
所以,首先,要认识到,浏览器的webapi其实是一个独立出来的api环境,包括捕捉用户的鼠标点击,双击,滑动,选择,等等操作。我们不知道浏览器内部的线程情况,比如,ui线程负责显示,什么线程负责repaint这些,什么线程负责解析树,什么线程负责,不清楚,但是,我们可以推断的是,webapi是另外的线程在控制,所以,不占用V8的线程。其他的部件也是不占用v8线程的,具体怎么排布可能要去研究浏览器内部的实现,而且每个浏览器也不一样。大体上,模型是一致的。
所以,在这样的前提下,我们把模型画出来,如下图所示:
webapi管着定时器,管着xhr异步,管着跟用户的操作,但是,这些都有一个特征,就是callback,callback可以索引到一块定义好的函数区域,然后,webapi在自身准备好的时候,(这个准备好ready的过程不描述,可能是用户滚动,移动端上,用户的操作,或者各种内置的接口)推出callback,把callback交给任务队列,而事件循环做的事情,就是把任务队列里面的时间放到执行栈里面去执行。
好,我们脑补一个xhr的过程,把某个执行的上下文压入stack里面,然后执行到xhr调用,这个时候,xhr调用执行完退出执行stack,webapi里面预制起了xhr的callback,这个callback是定义好的。然后,执行栈继续做下面的操作。不同线程不相干。 然后,xhr在自己的process完成之后,把数据结构拿回到callback,然后,callback的索引放到任务队列里面,这个时候,有两个while(true)一直跑着,一个是事件循环,一个是执行栈。任务队列是先进先出,事件循环拿出去,然后放到执行栈里面执行,over。
好,我们再脑补一个click过程,某个执行上下文压人stack里面,click的bind,这个时候,bind推出栈,然后,webapi里面声明了绑定事件,以及callback,然后,等用户click的时候,callback开始往任务队列里面压callback,然后,时间循环又来了,执行callback。
【本文来源于(微信公众号:猪猪侠杂谈)】
本文为原创文章,版权归作者所有,未经授权不得转载!
使用JavaScript实现Java的List功能
JavaScript数组常用方法介绍
JavaScript如何进行数组复制
javascript克隆对象深度介绍
java与javascript之间json格式数据互转详解
JavaScript和JSP的区别
JavaScript-JavaScript数据结构和算法之图和图算法,
在Java中执行JavaScript代码
java环境变量path和classpath的配置过程
JavaScript toFixed方法介绍
javascript的面向对象技术介绍
JavaScript与java语言的区别
javascript闭包的介绍理解和讲解实例
有关JavaScript中的prototype.bind()方法介绍
JavaScript中的操作符和判断规则的介绍
如何在Javascript中为String对象添加trim,ltrim,rtrim方法
javascript中的return和闭包函数
关于JavaScript中call()和apply() 的一些理解
JavaScript中创建字典对象(dictionary)的实例
CSS和JavaScript脚本实例
javascript中Function类型详细介绍
关于javascript中apply()和call()方法的区别
环境工程专业介绍
jQuery 和其他 JavaScript 框架使用方法
aircy,的过程,作者,3页,教程,js,javascript,分享
环境和命运的作文
Javascript基础教程之数组array
JavaScript与java语言有何不同
javascript中String对象的slice()方法
Dreamweaver中JavaScript行为操作
javascript中setInterval的用法总结
Dreamweaver中JavaScript行为操作使用方法
有关深入理解JavaScript中的并行处理的介绍
开放招商环境和政策介绍讲话
JavaScript与java语言有何区别
Dreamweaver中JavaScript行为操作使用的总结
用Javascript进行简单的Table点击排序
使用ajax操作JavaScript对象的方法
30行代码实现Javascript中的MVC
Javascript垃圾收集机制介绍