你不知道的JavaScript(1)LHS查询和RHS查询

打算把《你不知道的JavaScript》中的知识点整理下,写点自己的心得,同时也敦促自己看书。

先做个整体的介绍,最后会再给个综合的例子。

RHS 查询与简单地查找某个变量的值别无二致,而LHS 查询则是试图找到变量的容器本身,从而可以对其赋值。

LHS查询

LHS查询指的是找到变量的容器本身,从而可以对其进行赋值。也就是找到赋值操作的目标。

LHS查询的时候会沿着作用域链进行查询,找到的话就会将值赋值给这个变量,如果到达作用域顶端仍然找不到,就会在作用域链顶端创建这个变量。

举个例子

var a=2;

var a=2;相当于var a; a=2;

这里的a就是一个LHS引用,我们只是想要为2找到一个赋值的目标,而不会去关心这个目标(这里为a)的值是多少什么的。

因为var a;也就是已经把a添加到当前作用域了,所以LHS查询a的时候,找到了a,即找到了赋值操作的目标。

如果没有var a;那么LHS查询a的时候,就会找不到a,就会在作用域中创建这个变量a。

RHS查询

RHS查询就是普通的查询变量的值,即获取变量的值。

RHS查询的时候会沿着作用域链进行查询,找到的话就会取得这个值并返回,如果到达作用域顶端仍然找不到,就会抛出错误(比如TypeError、ReferenceError)。

举个例子

console.log(a);

这里的a就是一个RHS引用,因为console.log需要获取到a的值才能输出a的值。

当然这里的console.log也是一个RHS引用,这里对console 对象进行RHS 查询,并且检查得到的值中是否有一个叫作log 的方法。

例子中的a因为没有声明过,所以会抛出错误。

综合例子

(function test() {
    a=2;
});
console.log(a);

例子中的test函数因为没有执行,所以a=2;也就不会执行,也就不会进行LHS查询,自然就没有变量a啦。

而console.log(a)中对a进行RHS查询时,沿着作用域链查找,找不到a,所以会抛出错误(ReferenceError)。

不过如果立即执行的话就不会抛出错误。

(function test() {
    a=2;
})();
console.log(a);

在这里括号的作用是立即执行函数,因此赋值语句a=2就会执行,所以会对a沿着作用域链进行LHS查询,

LHS查询找不到a,便在作用域链顶端(全局作用域)创建变量a.

故console.log(a)中对a进行RHS查询时,沿着作用域链查找就可以在全局作用域中找到a了,也就可以取得a的值了。

当然上面的IIFE(立即执行函数)也可以写成另一种形势,执行结果一样。

(function test() {
    a=2;
}());
console.log(a);

理解LHS和RHS查询对于理解作用域至关重要呀,并且可以帮助我们解决很多bug。

原文地址:https://www.cnblogs.com/wuguanglin/p/LHSandRHS.html

时间: 2024-10-10 05:45:00

你不知道的JavaScript(1)LHS查询和RHS查询的相关文章

理解LHS查询与RHS查询

RHS 查询与简单地查找某个变量的值别无二致, 而 LHS 查询则是试图找到变量的容器本身, 从而可以对其赋值. 以下例子进行分析: 1 function foo(a) { 2 var b = a 3 return a + b 4 } 5 var c = foo(2) c = LHS查询, foo(2) RHS查询, 隐式赋值a =2 LHS查询, b = LHS查询, a RHS查询, return a + b a,b分别RHS查询 共三次LHS查询,四次RHS查询 如果 RHS 查询在所有嵌

JavaScript之找LHS查询和RHS查询

*********************我的答案******************************* LHS查询: foo(2)是将2赋值给a. var b = a是将a的值赋值给b. var c = foo(2)是将foo(2)的运行结果赋值给c. RHS查询: var b = a是要找到a的值并赋值给b. return a + b是要找到a的值. return a + b是要找到b的值. foo(2)是要找到foo()的值并进行运行. *********************参

javaScript keyCode对应表 ,以供查询

keycode    8 = BackSpace BackSpacekeycode    9 = Tab Tabkeycode   12 = Clearkeycode   13 = Enterkeycode   16 = Shift_Lkeycode   17 = Control_Lkeycode   18 = Alt_Lkeycode   19 = Pausekeycode   20 = Caps_Lockkeycode   27 = Escape Escapekeycode   32 = s

你不知道的Javascript(上卷)读书笔记之一 ---- 作用域

你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此书中,开始便提出:Javascript是一门编译型语言,我一开始以为这是国内翻译的锅,翻译的不够准确,后来我还专门去github看了,作者确实是将Js描述为一门编译型语言(compiled language).然而我认为作者更想表达的是Js也拥有和Java一般的特定的编译过程.而不是传统得认为只是单纯的进行&

【读书笔记】你不知道的JavaScript(上卷)--作用域是什么

第一章 作用域 1.理解作用域 几个名词的介绍 引擎:从头到尾负责整个JavaScript程序的编译及执行过程 编译器:负责语法分析及代码生成器等脏活累活 作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限. 对var a = 2;进行分解,了解引擎等是如何工作. 编译器首先将这段程序分解成词法单元,然后将词法单元解析成一个树结构.但是当编译器开始进行代码生成时,它对这段程序的处理方式会和预期的有所不同. 编译器会

《你不知道的JavaScript》读书笔记(一)作用域

名词 引擎:从头到尾负责整个 JavaScript 程序的 编译 及 执行 过程. 编译器:负责 语法分析 及 代码生成. 作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限. LHS:赋值操作的左侧(理解为赋值操作的目标是谁,LHS 查询 试图找到变量的容器本身,并对其 赋值 ). RHS:赋值操作的右侧(理解为谁是赋值操作的源头,RHS 查询 就是 查找 某个变量的值). JavaScript 的编译 Java

你不知道的JavaScript(作用域和闭包)

作用域和闭包 ?作用域 引擎:从头到尾负责整个JavaScript的编译及执行过程. 编译器:负责语法分析及代码生成等. 作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限. 作用域是一套规则,用于确定在何处以及如何查找变量(标识符). 如果查找的目的是对变量进行赋值,那么就会使用LHS查询: 如果目的是获取变量的值,就会使用RHS查询. ?词法作用域 无论函数在哪里被调用,也无论它如何被调用,它的词法作用域都只由

JavaScript提升(你不知道的JavaScript)

最近,在读<你不知道的JavaScript(上卷)>这本书,书中详细阐述了JavaScript众多重要但经常被大家忽略的点,在此强烈推荐!!!书中,第4章讲述了"提升",从示例出发讲述了变量和函数提升的过程,纠正了自己以前错误的理解(相信好多人理解都是错误)! 我们习惯将var a = 2;看做一个声明,而实际上JavaScript引擎不这么认为!下面几个示例让你彻底搞懂JavaScript中的变量提升! 示例1: a = 2; var a ; console.log(a)

JavaScript词法作用域(你不知道的JavaScript)

JavaScript并不是传统的块级作用域,而是函数作用域! 一.作用域 1. JavaScript引擎在代码执行前会对其进行编译,在这个过程中,像var a = 2 这样的声明会被分解成两个独立的步骤: 第一步(编译阶段):var a 在其作用域中声明新变量.这会在最开始的阶段,也就是代码执行前进行. 第二步(运行阶段):a = 2 会查询变量a(LHS查询)并对其进行赋值. 2. LHS & RHS(当前作用域->上级作用域->...->全局作用域) LHS(左侧):试图找到