Javascript是解释性语言,执行的时候动态解析编译。在端运行的时候,这里以浏览器为讨论环境。
浏览器主要分为Browser进程,Render进程,具体关系这里不深入讨论,可以参考下图:
这边有几个概念需要了解下:
执行环境:分为全局执行环境和函数执行环境,定义了变量或函数有权访问的其他数据;
注:web浏览器中全局执行环境被认为是window,关闭页面或浏览器才会销毁;
变量对象:每个执行环境都有一个变量对象,保存着当前执行环境中的所有变量和函数;
作用域:当前变量对象中的属性,js解析阶段就会确定;
活动对象:如果是函数在执行,将函数的活动对象设置为变量对象;
当代码在一个环境执行的时候,会创建一个
作用域链:它定义了当前执行环境有权访问的变量或函数的访问顺序,作用域链的顶端永远是当前执行环境的变量对象,再下一个变量对象就是下一个包含环境,一直延伸到全局执行环境的变量对象;
注:全局作用域的变量对象,永远是作用域链的最后一个对象。
代码执行的时候,会先判断浏览器缓存中是否有代码可执行的机器代码缓存(每个js引擎实现的方式不一致),如果有直接推入栈中执行,没有进入以下编译步骤:
v8 引擎: