JS 的LHS查询和RHS查询
几乎所有编程语言最基本的功能之一,就是能够储存变量当中的值,并且能在之后对这个 值进行访问或修改。但当我们要操作一个变量时,我们要怎样找到它呢?或者说我们怎么确定它是否存在呢
var a = 2
当我们看到这句代码时,正常的逻辑会认为声明一个变量a并赋值为2,但浏览器引擎不是这样认为的。这句代码会被分成两部分来执行var a 和a= 2; 并且一个是在代码执行前的预编译进行一个在引擎运行时执行。虽然这里的a是同一个变量但引擎两次查找这个变量的方式却是不一样的。
Lhs查询和RHS查询
当代码进行编译时,浏览器引擎看到var关键字,意味着这里需要声明变量会首先对a进行LHS查询。查询当前作用域中是否存在a这个标识符,如果存在浏览器引擎会忽略本次声明,如果没有会在作用域中声明一个标识符a。编译完成后浏览器看到a=2,会对a进行RHS查询,查找当前作用域中是否成在a这个变量或者说是容器,如果有就把2赋值给a,如果没有,引擎就会抛出 ReferenceError 异常。
L,S从字面意思来说是左边和右边就,在谁的的左边和右边呢?通常来说是赋值操作的左边和右边。通常的理解当我们需要知道赋值操作的目标是谁时(LHS)”以及“谁是赋值操作的源头 (RHS)”
function foo(a) {
b = a;
}
foo( 2 );
当代码运行到b = 2时,浏览器首先会对b进行LHS查询,此时作用域中没有变量b,浏览器会在全局作用域中创建一个b
function foo(a) {
console.log(b)
b = a;
}
foo( 2 );
来看这里在对b进行LHS查询之前有一个console.log(b),此时浏览器引擎会对b进行RHS查询,此时作用域中并没有b这个变量,引擎就会抛出 ReferenceError 异常。对同一个变量进行不同的查询会得到不同的结果。