Skip to main content

作用域

作用域,其实就是一套规则,用于存储和查找变量。而变量是程序的状态,有了状态,程序才会变的丰富。

JS也是一门编译语言,只不过它不是提前编译的。

编译原理

编译,是三个阶段的统称

  1. 分词 | 词法分析(tokenizing / lexing)

理解作用域

引擎,编译器,作用域

引擎:从头到尾负责编译和执行

编译器,将代码进行分词、解析,并做一些特定的优化,最终生成引擎可以执行的代码。 在编译的过程中,会使用到作用域,主要是进行变量的声明。比如查找是否存在,有就继续,没有就声明这种

作用域:负责收集并维护程序内的变量,并实施一套严格的规则,确定访问权限

JS编译时的性能优化

这是在分词、分析以及代码生成的阶段,有特定的步骤来运行。比如对冗余的元素进行优化

编译器

LHS查找

LHS(Left-hand side)查询是指赋值操作的左侧,即变量或对象属性,目的是为了找到变量,为了给其赋值

RHS查找

RHS(Right-hand side)查询是指赋值操作的右侧,即需要获取值的变量或对象属性。RHS 查询就是为了获取变量 a 的值

区分LHS和RHS另一个重要的事,是异常

RHS在所有作用域里都找不到变量时,就会抛出引用异常 ReferenceError LHR在所有作用域下都找不到变量时,就会在顶层作用上创建一个该变量。但是严格模式下还是会报错的,即不要意外(自动or隐式)地声明全局变量。 同会抛出ReferenceError

如果LHS找到了变量,但是做了不合理的操作,则会抛出TypeError