关于我们
语雀站点搭建指南
语雀站点搭建指南
移动端H5的屏幕适配
移动端H5的屏幕适配
一、相关概念
1.1 屏幕相关
1.2 像素
1.3 Retina屏幕
1.4 视窗(Viewport)
二、适配方案
2.1 Rem方案
2.2 Vw方案
2.3 微信小程序的适配方案
2.4 适配Iphonex
2.5 横屏适配
三、其它常见问题
3.1 1px问题
3.2 图片模糊问题
参考
小结
项目中遇到的问题总结
项目中遇到的问题总结
JavaScript中的LHS查询和RHS查询
Javascript中的Lhs查询和Rhs查询
细说Javascript作用域和闭包
一、Javascript有哪些作用域类型
二、作用域与标识符查询
执行环境与作用域链
标识符查询
三、可以形成独立作用域的结构
函数作用域
块作用域
四、提升
提升的表现
提升的优先级
提升的深层原因
五、跨越词法作用域的两种机制
Eval
With
六、闭包与模块机制
闭包
模块机制

# JavaScript中的LHS查询和RHS查询

作者:叶伟

JavaScript中在预编译后执行代码时对变量的查询分为LHS(Left-Hand-Side)查询和RHS(Right-Hand-Side)查询。

# 一、LHS和RHS有什么区别?

这里的L和R是指赋值时候“=” 的左侧还是右侧,也就是说一个是做被赋值,一个是取值。

正如下面这个例子,对变量a的引用是一个LHS引用,而对值2的引用是RHS引用

 
1
 
1

当然,在js中赋值操作不仅仅限于“=”这种显式赋值。还有一些隐式的赋值,比如:

 
1
 
1

这个例子中,执行函数foo的时候对foo进行了RHS引用,而对foo函数进行调用的时候隐藏着一个将2赋值给形式参数a的过程,即a=2,这里有对a的LHS引用。

# 二、为什么要区分LHS引用和RHS引用?

这两种不同的引用方式的在对没有声明的变量的处理上是不同的。而这个不同之处对于我们编写代码和分析JS引擎报的错误是很有用处的。

  • 当对一个变量执行RHS查询时,如果遍历该变量所在处的词法作用域未能找到这个变量,JS引擎就会抛出 ReferenceError 错误如果成功查询到了这个变量,但是对这个变量执行不合理操作,比如对一个非数组的变量执行下标取值,JS引擎就会抛出 TypeError 错误。
  • 当对一个变量执行LHS查询时,同样在遍历作用域后无法找到该变量,在非ES5的严格模式下,系统就会自动在全局作用域中创建一个同名变量,并将引用转移到该新建的全局变量中。而在ES5的严格模式下,LHS查询失败时JS引擎会抛出一个同RHS一样的 ReferenceError 错误。

因此,对LHS查询和RHS查询的仔细区分和理解无论是对JS执行过程本身的理解还是分析错误都是有所好处的。



帮助我改善此页面!