你不知道的JavaScript学习笔记1——作用域

时间:2021-03-09 14:48:41

处理程序三要素:

引擎:编译与执行过程。

编译器:语法分析与代码生成等。

作用域:收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。

 

示例:

var a=2;的解析过程:

1.编译器 询问 作用域 是否已经有该名称的变量

是:忽略该声明,继续执行;

否:声明一个新变量,命名为a;

 

2.编译器为引擎生成代码

引擎运行首先询问作用域,在当前作用域集合中是否存在一个a的变量:

是:引擎会使用这个变量;

否:引擎继续查找该变量;

  找到了:将2赋值给a。

  没找到:抛出异常。

 

总结:

变量赋值执行两个动作:

1.编译器声明一个变量;

2.运行时引擎在此作用域中查询(LHS查询)该变量,能找到就赋值。

 

引擎查询方式:

"L"和"R"分别代码左侧和右侧。什么东西的左侧和右侧?是一个赋值操作的左侧和右侧。

当变量出现在赋值操作的左侧时进行LHS查询,出现在右侧时执行RHS查询。

 

LHS查询:

1.赋值操作的目标是谁;

2.查找的目的是对变量进行赋值(=操作符或调用函数时传入参数的操作)。

 

RHS查询:

1.谁是赋值操作的源头;

2.查找的目的是获取变量的值。

 

报错类型:

ReferenceError异常:

1.严格模式下不成功的LHS(非严格模式下不成功的LHS会导致自动隐藏地创建一个全局变量并不会报异常);

2.不成功的RHS。

 

TypeError异常:

如果 RHS 查询找到了一个变量,但是你尝试对这个变量的值进行不合理的操作,比如试图对一个非函数类型的值进行函数调用,或着引用 null 或 undefined 类型的值中的属性,那么引擎会抛出另外一种类型的异常。

 

 

作用域嵌套规则:

引擎从当前的执行作用域开始查找变量,如果找不到,就向上一级继续查找。