《你不知道的JavaScript》(上卷)读书笔记:作用域和闭包1.2

理解作用域

承上文,目前出现了三个概念:

1.引擎:从头到尾负责整个JavaScript程序的编译及执行过程

个人感觉就像CPU里面的控制单元

2.编译器:引擎的好朋友之一,负责语法分析以及代码生成等脏话类活

个人感觉就像CPU里面的ALU

3.作用域:引擎的好朋友之一,负责收集维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限

个人感觉还缺少一个运行时环境,是引擎提供?

var a =2;

这句话,引擎认为这里有两个完全不同的声明!一个由编译器在编译时处理,另一个由引擎在运行时处理

遇到var a ,编译器会询问作用域是否已经有一个该名称的变量存在于同一个作用域的集合中,如果是,编译器会忽略该声明。

继续进行编译,否则它会要求作用域在当前作用域的集合中声明一个新变量,并命名为a;

与上文结合,看来作用域负责收集维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限(包括读写)。

接下来,编译器会为引擎生成运行时所需的代码,这些代码被用来处理a=2这个赋值操作。引擎运行时会首先询问作用域,在当前作用域集合中是否在一个叫作a的变量。如果是,引擎会使用这个变量,如果否,引擎会继续查找该变量,如果引擎最终找到了a变量,就会将2赋值给它,否则就会抛异常。

在上面的例子中,引擎会为变量进行LHS查询,另外一个查找的类型叫作RHS(LR分别代表左侧和右侧)

什么东西的左侧和右侧?是一个赋值操作的左侧和右侧。

变量出现在赋值操作的左侧进行LHS查询。出现在右侧进行RHS查询。

RHS查询与简单查找某个变量别无二致,而LHS查询则是试图找到变量的容器本身,从而可以对其赋值。

变量的容器本身,感觉是一个指针!联想到了左右值!

左值就是那些能够出现在赋值符号左边的东西;因此,右值就是那些可以出现在赋值符号右边的东西。

举个例子:

a = b *1;

a是一个左值,因为它标识了一个可以存储结果值的地点;b *1是一个右值,因为它指定了一个值

从这个角度说,RHS并不是真正意义上的“赋值操作的左侧”,而是“非左侧”。

下面一段代码:

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

var c=foo(2);

LHS查询:

c=..;a=2(隐式变量分配);b=..

RHS查询

foo(2);b=a;a..;..b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值