变量涉及两个问题:
1.储存;
2.查找;
作用:储存变量的计算机规则;(确定如何查找变量)
编译原理:
- js归类为“动态”/“解释执行”语言,是一门编译语言;
- 不提前编译:编译过程不在构建之前,编译发生在代码执行前;
- 传统编译语言执行前编译过程:
1. 分词/词法分析:将字符组分解成词法单元(代码块);
2. 解析/语法分析:将词法单元流(数组)转换成抽象语法树(AST)(逐级嵌套的语法结构树);
3. 代码生成:将AST转换成可执行带代码;
理解作用域:
- 引擎:编译和执行;
- 编译器:语法分析和代码生成;
- 作用域:收集和维护变量,限制变量访问权限;
- 变量赋值操作过程:编译器在作用域中声明变量,引擎运行时在作用域查找变量并赋值;
LHS:
赋值操作的目标;
获取/赋值;
‘=’或者函数传参时产生;
RHS:赋值操作的源头;获取;
- 作用域链规则:引擎从 当前作用域 或逐级向 最顶层作用域 寻找变量;
异常:
- ReferenceError: 作用域判别失败;
1. RHS查询时作用域中找不到变量抛错;
2. LHS查询时作用域链中找不到变量抛错(严格模式,非严格模式会自动创建);
- TypeError: 作用域判别成功,但对变量进行非法操作;
总结:
- js引擎在执行前编译:
1.作用域申明变量,在代码执行前进行;
2.查询并对其进行赋值,在执行时进行;