function foo(a){ console.log(a); } foo(2); 这是包含LHS、RHS的最简单的例子,首先我们的变量查询是在执行阶段,在执行foo()函数时需要对foo进行RHS引用,意味着“去找foo的值吧,并把他的值给我”。并且意味着foo的值需要被执行,因此它最好真的是一个函数类型的值! 这里有一个容易被忽略的细节。 代码中的一个隐式·操作a = 2会被忽略,这个操作发生在2被当作参数传给foo()函数时,2会被分配给参数a。为了给参数a(隐式地)分配值,需要进行一次LHS查询,这里面还有对a进行的RHS引用,并且将得到的值传给console.log()。console.log()本身也需要一个引用才能执行,因此会对console对象进行RHS查询并且检查得到的值是否有一个叫做log的方法。 这里我们就介绍一下LHSRHS的定义
LHS 和 RHS 的定义
英文定义:
- LHS (Left-Hand Side): A lookup performed to find a target location to store a value, typically occurring on the left side of an assignment operation.
- RHS (Right-Hand Side): A lookup performed to retrieve the value of a variable or expression, typically occurring on the right side of an assignment operation or wherever a value is needed.
中文定义:
- LHS(左值查找):为了找到一个存储值的目标位置而进行的查找,通常发生在赋值操作的左侧。
- RHS(右值查找):为了获取变量或表达式的值而进行的查找,通常发生在赋值操作的右侧或任何需要使用值的地方。
一句话定义
英文:
- LHS: A lookup to find where to store a value.
- RHS: A lookup to retrieve the value of a variable or expression.
中文:
- LHS:为了找到存储值的位置而进行的查找。
- RHS:为了获取变量或表达式的值而进行的查找。
这样简洁的定义可以帮助快速理解LHS和RHS查找的核心区别。 把我们当作v8引擎在执行阶段时我们遇到变量时我们对变量进行赋值, LHS换话句话说就是给存储值找到一个容器, 当我们遇见值时,如foo(a)函数... foo(2)我们为了获取a的值是什么所以我们会执行RHS操作,注意这里是对a的值进行获取而不是赋值!!! 为了获取变量或表达式的值而进行的查找就是RHS。
小心隐式赋值所带来的查询
function foo(a){ console.log(a); } foo(2); 还是这个例子隐式·操作a = 2会被忽略,这个操作发生在2被当作参数传给foo()函数时,2会被分配给参数a。为了给参数a(隐式地)分配值,需要进行一次LHS查询
接下来时大厂考题里面的最难点你将这个例子搞定了,腾讯这一关直接满分,没有满分我补给你!!!!!
function foo(a) {
var b = a;
return a + b;
}
var c = foo( 2 ); 中 LHS 和 RHS 引用的分析 LHS 引用(共 3 处):
c = ...: 在 var c = foo( 2 ); 这行代码中,c 出现在赋值操作符 = 的左侧,因此它是一个 LHS 引用。 我们想要找到 c 的容器并将其赋值为 foo(2) 的返回值。 [1] a = 2 (隐式变量分配): 当调用 foo(2) 时,会隐式地将参数 2 赋给函数的参数 a。 这个赋值操作也需要进行 LHS 查询来找到 a 的容器。 [2] b = ...: 在函数 foo(a) 内部,var b = a; 这行代码中,b 出现在赋值操作符 = 的左侧,因此它是一个 LHS 引用。 我们想要找到 b 的容器并将其赋值为 a 的值。 [1] RHS 引用(共 4 处):
foo(2 ...): 在 var c = foo( 2 ); 这行代码中,我们需要获取 foo 的值(也就是函数本身)并执行它。 因此,foo 是一个 RHS 引用。 [3] = a: 在 var b = a; 这行代码中,我们需要获取 a 的值并将其赋给 b。 因此,a 是一个 RHS 引用。 [3] a ...: 在 return a + b; 这行代码中,我们需要获取 a 的值并将其与 b 的值相加。 因此,a 是一个 RHS 引用。 [3] ... b: 在 return a + b; 这行代码中,我们需要获取 b 的值并将其与 a 的值相加。 因此,b 是一个 RHS 引用。 [3] 总结 LHS 引用用于找到变量的容器并对其赋值,而 RHS 引用用于获取变量的值。 在分析代码时,区分 LHS 和 RHS 引用可以帮助我们更好地理解代码的执行过程以及作用域的查找规则。
非严格模式下的LHS和RHS的区别
function foo(a){ console.log(a+b) b=a; } foo(2); 这里面的a,b值是多少呢?可以想一下... //ReferenceError: b is not defined //RHS 查找 失败的时候,会报出Reference Error错误,报错 因为在编译阶段a在LHS的作用下会默认声明变量但是RHS不行所以会有 b is not defined这个错误 因为在JS中是属于LHS·的特权,RHS没有这个权力,其实这也是有原因的比如你要给值找容器你有一个变量没申明那引擎为了保证代码可以执行会吧帮他声明,但时当我们要值的时候没有就是没有这个值不能乱给。 这里会有歧义,不符合同等地位的哲学观点所以有了严格模式
严格模式众生平等
在这个模式下,LHS和RHS都不能声明变量都要严格的按照js语法规则严格来进行! 说到这你的腾讯这一部分一定能拿下了祝你面试成功过来帮我一件三联