作用域是什么

118 阅读1分钟

变量涉及两个问题:

1.储存;
2.查找;

作用:储存变量的计算机规则;(确定如何查找变量)

编译原理:

- js归类为“动态”/“解释执行”语言,是一门编译语言;

- 不提前编译:编译过程不在构建之前,编译发生在代码执行前;

- 传统编译语言执行前编译过程:
    1. 分词/词法分析:将字符组分解成词法单元(代码块);
    2. 解析/语法分析:将词法单元流(数组)转换成抽象语法树(AST)(逐级嵌套的语法结构树);
    3. 代码生成:将AST转换成可执行带代码;

理解作用域:

- 引擎:编译和执行;

- 编译器:语法分析和代码生成;

- 作用域:收集和维护变量,限制变量访问权限;

- 变量赋值操作过程:编译器在作用域中声明变量,引擎运行时在作用域查找变量并赋值;

LHS:
    赋值操作的目标;
    获取/赋值;
    ‘=’或者函数传参时产生;

RHS:赋值操作的源头;获取;

- 作用域链规则:引擎从 当前作用域 或逐级向 最顶层作用域 寻找变量;

异常:

- ReferenceError: 作用域判别失败;
    1. RHS查询时作用域中找不到变量抛错;
    2. LHS查询时作用域链中找不到变量抛错(严格模式,非严格模式会自动创建);

- TypeError: 作用域判别成功,但对变量进行非法操作;

总结:

- js引擎在执行前编译:
    1.作用域申明变量,在代码执行前进行;
    2.查询并对其进行赋值,在执行时进行;