作用域
作用域,其实就是一套规则,用于存储和查找变量。而变量是程序的状态,有了状态,程序才会变的丰富。
JS也是一门编译语言,只不过它不是提前编译的。
编译原理
编译,是三个阶段的统称
- 分词 | 词法分析(tokenizing / lexing)
理解作用域
引擎,编译器,作用域
引擎:从头到尾负责编译和执行
编译器,将代码进行分词、解析,并做一些特定的优化,最终生成引擎可以执行的代码。 在编译的过程中,会使用到作用域,主要是进行变量的声明。比如查找是否存在,有就继续,没有就声明这种
作用域:负责收集并维护程序内的变量,并实施一套严格的规则,确定访问权限
JS编译时的性能优化
这是在分词、分析以及代码生成的阶段,有特定的步骤来运行。比如对冗余的元素进行优化
编译器
LHS查找
LHS(Left-hand side)查询是指赋值操作的左侧,即变量或对象属性,目的是为了找到变量,为了给其赋值
RHS查找
RHS(Right-hand side)查询是指赋值操作的右侧,即需要获取值的变量或对象属性。RHS 查询就是为了获取变量 a 的值
区分LHS和RHS另一个重要的事,是异常
RHS在所有作用域里都找不到变量时,就会抛出引用异常 ReferenceError LHR在所有作用域下都找不到变量时,就会在顶层作用上创建一个该变量。但是严格模式下还是会报错的,即不要意外(自动or隐式)地声明全局变量。 同会抛出ReferenceError
如果LHS找到了变量,但是做了不合理的操作,则会抛出TypeError