你不知道的JS--作用域-整理

 var a =2

引擎:执行js程序编译以及执行过程。
编译器:负责语法分析,代码生成
作用域:收集并且维护所有声明的变量组成的一系列查询,执行一套非常严格的规则,确定当前执行的代码对这些标志符的访问权限。
当我写下这段代码,编译器会执行哪些操作呢?

1.遇到var a编译器会询问作用域是否存在这么一个名称为a的变量。
如果有名称为a的变量,直接忽略这条声明。
如果没有名称为a的变量,会在当前作用域下声明一个新的变量,命名为a。
2.处理a=2编译器会为引擎生成运行时所需要的代码。这些代码用来处理 a=2这个赋值操作。
引擎先问作用域,当前作用域下是否有叫做a的变量。
如果有,引擎就会使用这个变量。
如果没有找到,就会爆出异常。

这段代码会执行两个动作:
1,编译器在当前作用域下声明一个变量,然后在运行时,引擎会在作用域找到这个变量,并且对他赋值。

介绍两个编译器术语

LHS 和RHS

简单举例说明:

var a=2  // LHS


console.log('a') //RHS

乍一看就是我在赋值的时候,是LHS
当我去找寻某些值的时候, 是RHS

但是这个对于引擎来讲:

LHS:查找的目的是对变量进行赋值
RHS:查找的目的是获取变量的值

在这里插入图片描述

LHS: 
var c = foo(2)
a=2
b=a

RHS:
foo(2)
var b =a
return a+b(这里是两个)

异常:

function foo(a) { 
console.log( a + b ); 
b = a;
}
foo( 2 );

当对b进行RHS查询时没有找到当前变量b时,(所有相关的作用域都没有找到它),引擎就会抛出ReferenceError
而当我们用LHS查询变量时,在顶层都没有找到目标变量,在非严格模式下(用const和let定义的变量)全局作用域中就会创建一个具有该名称的变量。并且返还给引擎。

猜你喜欢

转载自blog.csdn.net/weixin_40121676/article/details/121497734