基础
js是单线程语言。浏览器端JS是以单线程方式运行的,依赖于类型谷歌的v8引擎等各种js引擎,js又是解释型语言,不需要像Java那样先编译后执行。,js与UI渲染占用一个主线程。当然,通过webwork可以开启多线程。
js是异步执行的。js的快速解析速度得益于异步执行。js与UI渲染占用同一个主线程,这时如果js进行高负载的数据处理容易造成阻塞,造成浏览器卡顿。js提供了异步操作,像定时器(setTimeout、serInterval)、ajax请求、I/O回调等。通过事件循环实现
js的执行过程
大致分为三个步骤:
1.语法分析
2.预编译阶段
3.解释执行阶段
浏览器按顺序加载由<script>分割的代码块,加载第一个代码块后按以上顺序执行,之后再按顺序加载下一个代码块。
通过词法分析->语法分析->语法树->预编译->开始解释执行。更多详情
1语法分析
js脚本加载完代码块后,首先进行语法分析阶段。
在这一过程中主要分析语法等是否正确,如果错误抛出语法错误,停止这一代码块的执行,开始执行下一代码块;如果正确,进入下一阶段
2预编译阶段
进入这一过程之前,先了解一下js运行环境,js运行环境有三种:
1.全局环境(window)
2.函数环境,每一个函数就是一个作用域
3.eval
编译时每碰到一个运行环境就会创建一个执行上下文,推到栈内,形成函数执行栈。也就是说,每个函数有自己的执行环境。根据作用域链的规则,会优先在自己的作用域链找变量,然后去外层环境,因为js存在变量提升,所以会发生异常的输出。
因为预编译就发生在执行前,所以在创建执行上下文的时候会确定this指向。this指向的确立取决于当前的执行环境。
因为js的这一预编译过程,涉及到js的一些特性,比如执行上下文的问题,变量的声明提前,闭包,this指向的问题,静态作用域链是什么等。https://github.com/mqyqingfeng/Blog 这里对这些概念解释的比较清楚
预编译之前:
- 页面产生便创建了GO全局对象(Global Object&#