推荐有js开发经验的人阅读,本文档主要解释一些js内基础但又难以理解,或者容易误解的知识
作者:gaocc / 修订时间:2024-10-29
作用域是根据名称查找变量的一套规则
程序 var a = 2; 进行处理的过程中,涉及的概念
下面我们将 var a = 2; 分解。
1、遇到 var a,编译器会询问作用域是否已经有一个该名称的变量存在于同一个作用域的集合中。如果是,编译器会忽略该声明,继续进行编译;否则它会要求作用域在当前作用域的集合中声明一个新的变量,并命名为 a。
2、接下来编译器会为引擎生成运行时所需的代码,这些代码被用来处理 a = 2 这个赋值操作。引擎运行时会首先询问作用域,在当前的作用域集合中是否存在一个叫作 a 的变量。如果是,引擎就会使用这个变量;如果否,引擎会继续查找该变量。
当看到 var a = 2; 时,我们可能会认为这是一个声明。但 JavaScript 实际上会将其看成两个声明:var a; 和 a = 2;。第一个定义声明是在编译阶段进行的。第二个赋值声明会被留在原地等待执行阶段。
为帮助之后内容的理解,这里再深入了解查询的逻辑。查询分为 LHS 查询
,RHS 查询
。
LHS:当变量出现在赋值操作的左侧时进行 LHS 查询,试图找到变量的容器本身
RHS:非左侧查询,目的是查找某个变量的值
示例1:
function foo(a) {
console.log( a ); // 2
}
foo( 2 );