你不知道的JavaScript LHS 和 RHS 查找
今天在学习JavaScript的相关知识时接触到了 LHS(Left Hand Side)和 RHS(Right Hand Side)两种对变量查找的方法,之所以JavaScript要查找变量,那就先要了解JavaScript对变量赋值操作的原理:
变量的赋值执行两个动作,
1、编译器会在当前作用域中申明一个变量(如果之前没有申明过)。
2、在运行时引擎会在作用域中查找该变量,如果能找到就会对他赋值。
首先我们要知道JavaScript程序都是通过JavaScript引擎编译执行来完成的,那我们首先要知道引擎及他的好朋友编译器和作用域是什么
1、引擎:从头到尾负责整个JavaScript程序的编译及执行过程。
2、编译器:引擎的好朋友之一,负责语法分析及代码生成等脏活累活。
3、作用域:引擎的另一位好朋友,负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。
-------《你不知道的JavaScript 上卷》
编译器在编译执行过程的第二步中生成了代码,引擎执行它时,会通过查找变量来判断它是否已经声明过,查找的过程由作用域进行协助,但是引擎执行怎样的查找,会影响最终的查找结果。所谓的LHS和RHS查找,相信你一定能猜到“L”和“R”代表左侧和右侧,具体是什么的左侧和右侧呢?是赋值操作的左侧和右侧,但赋值操作不单单只是赋值操作符哦。
为了能够完成的理解JavaScript的工作原理,你需要开始像引擎(和他的朋友们)一样思考,从它们的角度提出问题,并从他们的角度回答这些问题,我们首先来看一个例子:
// 代码部分
function foo(a) {
console.log( a ); //2
}
foo( 2 );
让我们把上面这段代码的处理过程想象成一段对话,这段对话可能是下面这样的。
引擎: 我说作用域, 我需要为 foo 进行 RHS 引用。 你见过它吗?
作用域: 别说, 我还真见过, 编译器那小子刚刚声明了它。 它是一个函数, 给你。
引擎: 哥们太够意思了! 好吧, 我来执行一下 foo。
引擎: 作用域, 还有个事儿。 我需要为 a 进行 LHS 引用, 这个你见过吗?
作用域: 这个也见过, 编译器最近把它声名为 foo 的一个形式参数了, 拿去吧。
引擎: 大恩不言谢, 你总是这么棒。 现在我要把 2 赋值给 a。
引擎: 哥们, 不好意思又来打扰你。 我要为 console 进行 RHS 引用, 你见过它吗?
作用域: 咱俩谁跟谁啊, 再说我就是干这个。 这个我也有, console 是个内置对象。给你。
引擎: 么么哒。 我得看看这里面是不是有 log(..)。 太好了, 找到了, 是一个函数。
引擎: 哥们, 能帮我再找一下对 a 的 RHS 引用吗? 虽然我记得它, 但想再确认一次。
作用域: 放心吧, 这个变量没有变动过, 拿走, 不谢。
引擎: 真棒。 我来把 a 的值, 也就是 2, 传递进 log(..)。
-------《你不知道的JavaScript 上卷》
LHS和RHS的含义是“赋值操作的左侧和右侧”并不一定意味着是“=赋值操作符的左侧或右侧。赋值操作还有其他几种形式,因此在概念上最好将其理解为“赋值操作符的目标是谁(LHS)”以及“谁是赋值操作的源头(RHS)”。
在上面的例子中要注意的是:console.log(..) 本身也需要一个引用才能执行,因此会对console 对象进行RHS 查询,并且检查得到的值中是否有一个叫作log 的方法。这里不会再对log进行RHS查询。因为对console查询完毕后,对象属性访问规则会接管对log属性的访问。也就是说,如果是访问对象的属性就不存在LHS查询和RHS查询了,找不到就返回undefined。
你不知道的JavaScript LHS 和 RHS 查找的更多相关文章
- 读书笔记-你不知道的JavaScript(上)
本文首发在我的个人博客:http://muyunyun.cn/ <你不知道的JavaScript>系列丛书给出了很多颠覆以往对JavaScript认知的点, 读完上卷,受益匪浅,于是对其精 ...
- 你不知道的JavaScript(1)LHS查询和RHS查询
打算把<你不知道的JavaScript>中的知识点整理下,写点自己的心得,同时也敦促自己看书. 先做个整体的介绍,最后会再给个综合的例子. RHS 查询与简单地查找某个变量的值别无二致,而 ...
- javascript中的LHS和RHS
最近在拜读<你不知道的javascript>,接触到一个比较陌生的概念,LHS查询和RHS查询. 简单的一句话来讲,当变量出现在赋值操作符的左侧时进行LHS查询,出现在右侧时进行RHS查询 ...
- 【转】javascript中的LHS与RHS
原文链接:http://www.cnblogs.com/yangxiaoguai132/p/5064625.html 最近在学习javascript过程中,接触了LHS与RHS的概念,刚开始的时候有点 ...
- javascript中的LHS与RHS
最近在学习javascript过程中,接触了LHS与RHS的概念,刚开始的时候有点理解不清,现在做一些梳理,方便以后进行理解. LHS与RHS:javascript引擎的两种查找类型,含义是赋值操作的 ...
- JavaScript 的查询机制——LHS 与 RHS
JavaScript 引擎在查找一个变量的时候,有两种查找机制:LHS 和 RHS. RHS 的查询是简单地查找到某个变量的值,而 LHS 则是试图找到变量的容器的本身. 一个简单的例子:当我们执行 ...
- 你不知道的Javascript(上卷)读书笔记之一 ---- 作用域
你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此 ...
- 你不知道的JavaScript上卷笔记
你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章 初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...
- 你不知道的javaScript上卷(第一章 作用域是什么)
在写这篇博客时这本书我已经是看过一遍了,为了加深印象和深入学习于是打算做这系列的前端经典书籍导读博文,大家如果觉得这本书讲的好可以自己买来看看,我是比较喜欢看纸质版书的,因为这样才有读书的那种感觉. ...
随机推荐
- 安装新版redis4.0.6
看看新版本有那些特性提升,测试用!先安装 网址:https://redis.io/download 获取:wget http://download.redis.io/releases/redis-4. ...
- v-radio
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 微信小程序session_key和access_token傻傻分不清楚
之前一直对着文档使用特定接口, 今天闲来仔细研究一下各个接口的使用, 然后发现了session_key和access_token两个关键字意义有点重复啊? 目测都是某种钥匙来打开一扇门的, 那为什么有 ...
- 国产龙芯服务器源码安装PostgreSQL数据库的方法
1. 公司最近有一些国产化项目的需求, 要求在国产CPU的服务器上面安装pg数据库等. 2.. 但是差查了下中标麒麟的官网,在龙芯MIPS的操作系统包源里面仅有 postgreSQL 9.2 版本的r ...
- [转帖]一个关于国密SM4的故事
一个关于国密SM4的故事 https://www.cnblogs.com/ouyida3/p/10053862.html SM1 硬件SM2 非对称加密SM3 hash算法SM4 对称加密 一个关于国 ...
- sql query skill
https://www.w3resource.com/sqlite/sqlite-select-query-statement.php /* SELECT ChipID FROM "tb_X ...
- Spring Boot-日志配置(超详细)
Spring Boot-日志配置(超详细) 更新日志: 20170810 更新通过 application.yml传递参数到 logback 中. Spring Boot-日志配置超详细 默认日志 L ...
- 20190705-Python数据驱动之DDT
DDT ddt 是第三方模块,需安装, pip install ddt DDT包含的装饰器 包含一个类装饰器@ddt和两个方法装饰器@data和@file_data 通常情况下,@data中的数据按照 ...
- PAT(B) 1006 换个格式输出整数(Java)
题目链接:1006 换个格式输出整数 (15 point(s)) 代码 /** * Score 15 * Run Time 153ms * @author wowpH * @version 1.1 * ...
- java异常那些事
异常的基本定义: 异常情形是指阻止当前方法或者作用域继续执行的问题.在这里一定要明确一点:异常代码某种程度的错误,尽管Java有异常处理机制,但是我们不能以“正常”的眼光来看待异常,异常处理机制的原因 ...