JS 的LHS查询和RHS查询

JS 的LHS查询和RHS查询

    几乎所有编程语言最基本的功能之一,就是能够储存变量当中的值,并且能在之后对这个 值进行访问或修改。但当我们要操作一个变量时,我们要怎样找到它呢?或者说我们怎么确定它是否存在呢

var a = 2

    当我们看到这句代码时,正常的逻辑会认为声明一个变量a并赋值为2,但浏览器引擎不是这样认为的。这句代码会被分成两部分来执行var a 和a= 2; 并且一个是在代码执行前的预编译进行一个在引擎运行时执行。虽然这里的a是同一个变量但引擎两次查找这个变量的方式却是不一样的。

Lhs查询和RHS查询

    当代码进行编译时,浏览器引擎看到var关键字,意味着这里需要声明变量会首先对a进行LHS查询。查询当前作用域中是否存在a这个标识符,如果存在浏览器引擎会忽略本次声明,如果没有会在作用域中声明一个标识符a。编译完成后浏览器看到a=2,会对a进行RHS查询,查找当前作用域中是否成在a这个变量或者说是容器,如果有就把2赋值给a,如果没有,引擎就会抛出 ReferenceError 异常。
    L,S从字面意思来说是左边和右边就,在谁的的左边和右边呢?通常来说是赋值操作的左边和右边。通常的理解当我们需要知道赋值操作的目标是谁时(LHS)”以及“谁是赋值操作的源头 (RHS)”

function foo(a) { 
 	b = a;
 }
 foo( 2 );

当代码运行到b = 2时,浏览器首先会对b进行LHS查询,此时作用域中没有变量b,浏览器会在全局作用域中创建一个b

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

来看这里在对b进行LHS查询之前有一个console.log(b),此时浏览器引擎会对b进行RHS查询,此时作用域中并没有b这个变量,引擎就会抛出 ReferenceError 异常。对同一个变量进行不同的查询会得到不同的结果。

猜你喜欢

转载自blog.csdn.net/evail_/article/details/107547527
今日推荐