我的目录:
什么是作用域?
变量被引入程序后存储在哪?程序需要时如何将其找到?这些问题的说明需要一套设计良好的规则来存储变量,且可以方便的找到这些变量,这套规则被称为作用域。
什么是编译原理?
在传统编译语言流程中,一段源代码在执行前经历三个步骤,统称为编译。
- 分词/词法分析
将字符组成的字符串分解为有意义的代码块,这些代码块称为词法单元
var a = 2;(被分解为 var, a, =, 2, ;这些词法单元)
- 解析/语法分析
将词法单元流转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树,此树称为抽象语法树(AST)。
- 代码生成
将AST转换为可执行代码的过程
理解作用域
-
LHS和RHS的含义
LHS:赋值操作的目标是谁
RHS:谁是赋值操作的源头
举一个复杂的例子:(找出所有的LHS查询和RHS查询)
function foo(a){ var b = a; return a+b; } var c =foo(2);
上述代码有3处LHS和4处RHS
分析:
3处LHS:
首先想要执行foo函数就得先调用,先看调用处。要获得c的值,就得执行LHS查询(这是第一次)
隐式操作,调用了foo()函数,执行foo()函数时,实则将foo(2)中的2给了foo(a)中的a,即a=2,将实参2给了形参a,即对a进行LHS查询(这是第二次)
要想获得b的值,就要对b进行LHS查询(这是第三次)
4处RHS:
要调用foo()函数,就需要知道foo(2)的值,对foo(2)进行RHS查询(这是第一次)
将a赋值给b,需要知道a的值,对a进行RHS查询(这是第二次)
要返回a+b的值,需要知道a和b的值,则再次对a和b各进行一次RHS查询(这是第三次和第四次)
-
作用域嵌套
其实在我们刚开始学习编程时大家都知道作用域分为全局作用域和局部作用域。只不过在==你不知道的JavaScript(上)==这本书中给我们更深层意义上解释了它。
简单的来说作用域的嵌套就是一个函数套在另一个函数中,在当前作用域中无法找到某个变量时,引擎就会在外层嵌套的作用域中继续查找,直到找到此变量,当到达最外层时无论是否找到,查找过程都会停止。
上代码我们来看看作用域的嵌套是怎么一回事:
function foo(a){ console.log(a+b); } var b = 2; foo(2);
要想在控制台上输出a+b的值,此时执行输出a+b的语句在foo(a)函数中,这就属于局部作用域,而b却不在此作用域中,往上一级作用域查找,b所在的作用域就属于全局作用域,找到变量执行语句即可。
-
异常
- RHS查询在所有嵌套作用域中找不到所需变量,引擎抛出ReferenceError异常。若找到所需变量,但尝试对此变量的值进行不合理操作,引擎会抛出一个TypeError异常。
- LSH查询在全局作用域中无法找到目标变量,在非严格模式下会自动创建一个变量并返回给引擎。在严格模式中会抛出ReferenceError异常。
ps:我只是把博客当作分享和记录自己学习成果的平台,小白一个,但在努力成为一个合格优秀的程序员的路上。感谢大家提出的意见。