闭包:只是一个绑定了执行了环境的函数,这个函数并不是印在书本里的一条简单表达式,闭包与普通函数的区别是,闭包携带了执行的环境 这个函数也带有在程序中生存的环境
javascript闭包组成部分: 环境部分 环境:函数的词法环境(执行上下文的一部分) 表识符列表: 函数中用到的没声明的变量 表达式部分 函数体
作用域链
- 引擎
从头到尾负责整个JavaScript程序的编译和执行过程
- 编译器
负责语法分析和代码生成
- 作用域
负责收集并维护由所有声明的表识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些表识符的访问权限
执行上下
执行上下文在ES3中,包含了三个部分
scope :作用域 常常被叫做作用域链
variable object: 变量对象 用于存储变量的对象
this value : this 值
在ES5中,改进了命名方式
lexical enviroment:词法环境 当获取变量时使用
variable eviroment: 变量环境 当声明变量是使用
this value : this 值
在ES2018中,执行上下文
lexical envirroment 词法环境 当获取变量或者this值式使用
variable environment: 变量环境 当变量声明时使用
code evaluation state 用于恢复代码执行位置
Function 执行的任务是函数时使用,表示正在被执行的函数
ScriptOrModule 执行的任务是脚本或者模块时使用 ,表示正在被执行的代码
Realm :使用的基础库和内置对象实例
Generator 仅生成器上下文有这个属性表示当前生成器
this值
javaScript代码执行经历的步骤
- 分词/词法分析
将字符串分解成有意义的代码块,这些代码块被称为词法单元
- 解析/语法分析
将词法单元流转换成一个有元素逐级嵌套所组成的代表了程序语法结构的树,该树称为抽象语法树
- 代码生成
将AST转换成可执行的代码过程被称为代码生成
