ECMAScript(简称:ES)是 JavaScript 脚本语言的一种规范。JavaScript 是 ECMAScript 的一种实现。
ES6 也可以称为 ES2015,是指 2015 年发布的正式版本的语言标准。ES7 也可以称为 ES2016,是指 2016 年发布的正式版本的语言标准。以此类推。
在 ES6+ 中,对一些术语进行了新的描述。
目前浏览器对 ES6+ 的支持度不好,可以使用转译工具,比如 Babel,将 ES6 +最终编译为浏览器可识别的 ES5。
JS 代码的执行过程:
JS 代码的执行过程整体思路还是一样的。但是执行上下文关联的不再是 VO、作用域链和 this,而是词法环境(Lexical Environments)。词法环境由环境记录(Environemt Record)和外部的词法环境(Outer)两部分组成。
词法环境的类型:
词法环境(Lexical Environments)其实分为词法环境(LexicalEnvironment)和变量环境(VariableEnvironment)。VariableEnvironment 用于处理 var 和 function 声明的标识符;LexicalEnvironment 用于处理 lei、const 声明的标识符。
不同浏览器的实现不同,有的浏览器会将值进行一份拷贝,拆分开词法环境和变量环境;有的浏览器就直接实现为了同一个对象,使用的时候判断一下使用哪个引用来进行处理,如果是使用 VariableEnvironment 的话,就处理 var 和 function 声明的标识符,如果是使用 LexicalEnvironment 的话,就处理 lei、const 声明的标识符。
环境记录的类型:
环境记录具体分为两种类型:
- 声明式环境记录:用来定义直接将标识符与语言值绑定的 ES 语法元素,例如 let、const、class、module、import 以及函数声明等。
- 对象式环境记录:用来定义将标识符与某些对象属性相绑定的 ES 语法元素,例如 with 语句、全局 var 声明的变量、全局的函数等。
var name = 'Lee'
function foo() {}
let age = 18
// 代码块不会形成新的执行上下文,但是会形成新的词法环境
// 当执行到这一步时,全局执行上下文中的词法环境会指向当前代码块的词法环境
{
var height = 1.88 // var 声明的变量没有块级作用域,因此会被加到全局环境记录中的对象式环境记录,代码执行完毕 height 也不会被销毁
let address = '广州市'
}
// 代码块执行中的代码执行完毕,全局执行上下文中的词法环境指回全局的词法环境;代码块的词法环境没有再被引用到,被垃圾回收器回收



理解ES6+中的执行上下文与词法环境
ECMAScript(ES)是JavaScript的规范,ES6和ES7分别代表2015年和2016年的标准。由于浏览器对ES6+支持不足,常使用Babel进行转译。JS执行过程涉及词法环境,包括环境记录和外部环境,处理var、let、const等不同类型的变量。全局环境记录由对象式和声明式环境记录组成,块级作用域仅影响let和const。代码块执行后,局部词法环境可能被垃圾回收。
1101

被折叠的 条评论
为什么被折叠?



