JS的运行环境一般由宿主环境和执行期环境共同构成,宿主环境是由外壳程序(如web浏览器就是一个外壳程序)生成,执行期环境是由嵌入到外壳程序中的JS引擎(/JS解释器)生成的,在执行期环境JS可以生成内置静态对象、初始化执行环境等。
宿主环境一般由外壳程序创建和维护,在一个宿主环境中可以运行多种脚本语言(如VBScript),以虚拟机的方式提供一个跨语言跨平台的宿主环境
宿主环境一般会创建一套公共对象系统,该系统对所有脚本都开放,允许它们自由访问,还提供了公共接口,用来装载不同的脚本语言引擎
脚本语言本身并不提供IO,也没有与系统和外界通信的能力,更不存在管理内存,修改注册表等行为,这些行为全部由宿主环境完成
外壳程序不仅是web浏览器,任何可以提供JS引擎执行环境的都可以称之为外壳程序,外壳程序还可以利用符合标准的扩展接口接纳更多的插件、组件或ActiveX控件等DLL应用
执行期环境是由宿主环境通过脚本引擎创建的一个代码解析初始化环境
JS的解析过程包括编译和运行
编译:预处理,在这一过程中,JS解释器完成对JS代码的预处理,即将JS脚本代码转换成字节码
运行:在这一阶段,将编译结束时生成的字节码转换成机械码,按顺序执行
JS是一种解释型语言,所谓解释型是指代码在执行时被解释器一行一行动态编译和执行,而不是执行前完成编译,即边编译边执行,
一般的编译性语言的编译过程是由编译器完成,进行词法分析、语法分析、语义检查、代码优化、最后生成字节码
JS的是词法分析、语法分析,建立语法树,开始解释执行
执行期
JS引擎按着作用域机制来执行,JS的变量和函数作用域是在定义时决定的,而不是执行时才决定的,所以JS解释器只需要通过静态分析就能确定每个变量和函数的作用域,这种作用域称为静态作用域
当JS解释器执行函数时,先创建一个执行环境,在这个执行环境中创建一个调用对象,在这个对象内存储当前域中所有的局部变量、参数、嵌套函数、外部引用和父级引用列表等
通过声明语句定义的变量和函数在预编译阶段就已经存储到符号表中了,然后把它们与调用对象中的同名属性进行映射即可。调用对象的生命周期和函数的生命周期一致
JS解释器通过作用域链将多个嵌套的作用域连在一起,并利用该链条来检索变量的值