理解作用域

mac2026-06-06  3

今天在 《你不知道的Javascript(上)》 学习到了作用域相关的知识点. 记录一下…

需要了解的角色

引擎
从头到尾负责 javaScript 程序的编辑执行过程
编释器
负责语法分析及代码生成等
作用域
引擎的好朋友,负责收集并维护所有声明的变量; 确定当前执行代码对变量的访问权限

举个栗子,看看他们是怎么工作的: var a = 2;

遇到var a,编释器会问作用域是否已经有一个该变量存在同一个作用域的集合中。如果是,编释器会忽略该次声明,继续进行编译;否则在该作用域声明一个变量接下来编释器会为引擎声明运行时所需要的代码,代码用来处理 a = 2 的这个赋值操作。接下来 ,引擎会问作用域是否存在变量a。 如果是引擎将使用这个变量;否则引擎会继续查找如果引擎最终找到了 a 变量,就会将 2 赋值给它。否则引擎就会举手示意并抛出一个异 常!

LHS 和 RHS 查询

LHS,RHS 这两个术语就是出现在引擎对变量进行查询的时候,我用我理解的方式解答:

LHS = 变量赋值或写入内存。 RHS = 变量查找或从内存中读取。

拿书中的例子做理解:

function foo(a) { var b = a; return a + b; } var c = foo( 2 );

执行查找: LHS (写入内存):

c= , a=2 (隐式分配值) , b=

RHS (读取内存) :

foo(2) , =a, a, b

看书下的答案:

LHS 和 RHS 异常

不合理的操作
HRS抛错
LRS抛错
“use strict” function init(a){ b=a+3; } init(2); console.log(b);

总结:

LHS 和 RHS 引用都会在当作用域进行查找,如果没有找到,向上一级查找,直到抵达全局作用域停止在严格模式下,找不到所需变量时,引擎都会抛出 ReferenceError异常。在非严格模式下,LHS会创建一个具有该名称的变量。如果查询成功,对变量的值进行不合理的操作,引擎都会抛出TypeError异常。ReferenceError 同作用域判别失败相关,而 TypeError 则代表作用域判别成功了,但是对 结果的操作是非法或不合理的。

拜拜👋

最新回复(0)