第一部分 第1章 作用域是什么

2018-10-14  本文已影响0人  酥枫

作用域

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

LHS查询和RHS查询

LHS查询就是Left-Hand-Side查询,RHS查询就是Right-Hand-Side查询,什么的左边和右边呢?一般来说是一个复制操作的左边和右边,即当变量出现在复制操作的左侧时进行LHS查询,出现在右侧时进行RHS查询。讲得更确切一点,RHS查询就是简单地寻找某个变量的值为多少,而LHS查询则是试图找到可以容纳变量的值的那个容器本身。
例如:

var a=2;
console.log(a);

这两行代码,第一行中,声明一个变量a,然后赋值为2,第二行输出,这里第一行是LHS查询(或者称为LHS引用)因为在这里我们并不关心a当前的值是什么,只想要为=2这个赋值操作找到一个目标,找到容纳2的一个容器。第二行输出a的值,对a的引用是一个RHS引用,因为这里a并没有赋任何值,我们需要查找到a这个变量的值为多少然后输出。
例一:

function foo(){
    //...
}
foo();

最后一行foo()函数调用需要对foo进行RHS查询。
例二:

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

上面几行代码里存在3处LHS查询和4处RHS查询(要注意到foo(2)中存在隐式赋值,即将2赋值给a,这里是一个LHS查询)。

LHS查询和RHS查询的异常

在以上两种模式下,如果RHS查询找到的变量,但尝试对这个变量的值进行不合理的操作,例如对一个非函数类型的值进行函数调用或者引用null/undefined的属性,那么引擎就会抛出另一个异常,叫TypeError,表示变量找到了,作用域判别成功了但对变量的值的操作是非法的。

上一篇 下一篇

猜你喜欢

热点阅读