> 文章列表 > Chrome v8原理学习:Javascript编译之LHS与RHS

Chrome v8原理学习:Javascript编译之LHS与RHS

Chrome v8原理学习:Javascript编译之LHS与RHS

“L”和“R”的含义,它们分别代表左侧和右侧。

什么东西的左侧和右侧?是一个赋值操作的左侧和右侧。换句话说,当变量出现在赋值操作的左侧时进行LHS查询,出现在右侧时进行RHS查询。

讲得更准确一点,RHS查询与简单地查找某个变量的值别无二致,而LHS查询则是试图找到变量的容器本身,从而可以对其赋值。从这个角度说,RHS并不是真正意义上的“赋值操作的右侧”,更准确地说是“非左侧”。你可以将RHS理解成retrieve his source value(取到它的源值),这意味着“得到某某的值”。

考虑以下代码:

console.log(a);

其中对a的引用是一个RHS引用,因为这里a并没有赋予任何值。相应地,需要查找并取得a的值,这样才能将值传递给console.log(…)。

a = 2;

这里对a的引用则是LHS引用,因为实际上我们并不关心当前的值是什么,只是想要为=2这个赋值操作找到一个目标。

LHS和RHS的含义是“赋值操作的左侧或右侧”并不一定意味着就是“=赋值操作符的左侧或右侧”。
赋值操作还有其他几种形式,因此在概念上最好将其理解为“赋值操作的目标是谁(LHS)”以及“谁是赋值操作的源头(RHS)”

function foo (a) {console.log (a); // 2
}
foo (2);

foo (…)函数的调用需要对foo进行RHS引用,意味着“去找到foo的值,并把它给我”。并且(…)意味着foo的值需要被执行,因此它最好真的是一个函数类型的值!

  • foo函数内,会进行一次LHS查询,a = 2;并2赋予形参a
  • console.log(2);进行LHS,将2赋予console.log
var foo;
foo = function(a) {...}

如果这样理解的话,这个函数声明将需要进行LHS查询。
【!!!这样理解是错误的】

然而还有一个重要的细微差别,编译器可以在代码生成的同时处理声明和值的定义,比如在引擎执行代码时,并不会有线程专门用来将一个函数值“分配给”foo。因此,将函数声明理解成前面讨论的LHS查询和赋值的形式并不合适。

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

LHS查询

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

RHS查询

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

内容来源你不知道的javascript