JS-一定要知道的两种变量查询

302 阅读2分钟

什么是RHS、LHS

这是两种查询变量的方式

  1. RHS
  • “=”右边的动作,获取 “ = ” 右边语句的值
  • 其实,任何获取变量的值的查询,都是RHS
  1. LHS
  • “ = ”左边的动作
  • 找到存放变量存放的容器本身,然后把获取到的值放进去
  • 其实,任何对变量赋值的查询,都是LHS

举个例子

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

foo( 2 );

你知道,其中哪些进行了RHS,哪里进行了LHS吗

这里我们讲的是执行过程,不是编译过程

  1. foo函数调用,需要找到 foo所指向的函数的值。所以这里是RHS

  2. foo函数执行时,传入了一个参数,这个参数由形参a接收。a的值被赋为2。所以这里是LHS

  3. 函数内部的console.log( a )执行语句,这里分成两部分来看。

    • 第一部分找到console.log函数,console是LHS查询,而.log是原型链规则查询,既不属于LHS,也不属于RHS。
    • 第二部分传入a这个形参。该过程要获取a的值,所以是RHS。之后会将该值赋给console.log()的参数,所以是LHS。也就是说,这里即发生了RHS,也发生了LHS

为什么区分LHS和RHS是一件很重要的事情

  1. 当JS引擎做LHS查询的时候,如果当前作用域没有声明该变量,就会继续往外面的作用域继续查找,一只查到全局作用域,如果全局作用域也没有该变量,就会在全局作用域中声明该变量

  2. 做RHS查询的时候,只是关心该变量的值,会顺着作用域链一直查询。如果到全局作用域都没有查到该变量,就会抛出ReferenceError异常

  3. 也就是说,只有LHS查询会执行在作用域中声明变量的操作,而RHS不会(这个我们要特别注意)

区分RHS和LHS的技巧

想想JS引擎在执行过程中,需要的是变量的值,还是变量的容器

我们在再做一个练习

下面的代码,在执行过程中的查询,哪些是LHS,哪些是RHS

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

var c = foo( 2 );

答案:

LHS查询(这里有3处!)

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

RHS查询(这里有4处!)

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

进阶应用可以查看函数表达式一章节

JS-变量提升-进阶

总结

  1. 什么是LHS查询、RHS查询
  2. 为什么我们要做这样的一个区分
  3. 区分RHS和LHS的技巧
  4. 进阶应用可以查看函数表达式一章节
  5. 文章这么精彩不点个赞么,球球宁了