javascript作用域是什么?(深度理解)

JavaScript理解
1.1、编译原理程序中的一段源代码在执行之前会经历三个步骤,统称为“编译”
1、分词\词法分析将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代码块被称为词法单元。
2、解析/语法分析这个过程是将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树。这个树被称为“抽象语法树”。
3、代码生成将AST(Abstract Syntax Tree, AST)转换为可执行代码的过程被称为代码生成。对于JavaScript来说,大部分情况下编译发生在代码执行前的几微秒(甚至更短!)的时间内。
1.2、理解作用域 从“引擎”,“编译器”,“作用域”三者之间的关系开始谈起。
引擎:从头到尾负责整个JavaScript程序的编译及执行过程。
编译器:负责语法分析及代码生成等脏活累活。
作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。
生成过程:
1.遇到var a,编译器会询问作用域是否已经有一个该名称的变量存在于同一个作用域的集合中。如果是,编译器会忽略该声明,继续进行编译;否则它会要求作用域在当前作用域的集合中声明一个新的变量,并命名为a。
2.接下来编译器会为引擎生成运行时所需的代码,这些代码被用来处理a = 2这个赋值操作。引擎运行时会首先询问作用域,在当前的作用域集合中是否存在一个叫作a的变量。如果是,引擎就会使用这个变量;如果否,引擎会继续查找该变量。
3.如果引擎最终找到了a变量,就会将2赋值给它。否则引擎就会举手示意并抛出一个异常!
LHS和RHS的含义是“赋值操作的左侧或右侧”并不一定意味着就是“=赋值操作符的左侧或右侧”。赋值操作还有其他几种形式,因此在概念上最好将其理解为“赋值操作的目标是谁(LHS)”以及“谁是赋值操作的源头(RHS)”。
作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,那么就会使用LHS查询;如果目的是获取变量的值,就会使用RHS查询。
LHS和RHS查询都会在当前执行作用域中开始,如果有需要(也就是说它们没有找到所需的标识符),就会向上级作用域继续查找目标标识符,这样每次上升一级作用域(一层楼),最后抵达全局作用域(顶层),无论找到或没找到都将停止。
LHS会在当前作用域为目标标识符赋值,如果当前作用域没有,回向父级作用域查找,如果没有会接着网上查找,直到全局作用域,如果全局作用域也没有,就会在自动隐式地创建一个全局变量。
RSH会在当前作用域查找需要的目标标识符,如果在当前作用域没有,回向父级作用域查找,如果没有会接着网上查找,直到全局作用域,如果全局作用域也没有,不成功的RHS引用会导致抛出ReferenceError异常。

你可能感兴趣的:(笔记)