var number = 1;
复制代码
当你看到这段代码的时候,你可能简单的认为是为变量。事实上,这里是分为两个阶段处理,
。是由编译器和引擎协助工做。bash
引擎:负责整个JavaScript的编译和执行过程。函数
编译器:负责JavaScript的语法分析和代码生成。post
碰见var number,编译器会询问做用域中是够已经有一个名称为number的变量存在于当前做用域中,若是存在,会忽略当前声明。若是不存在就是在当前做用域声明一个变量number。这这个阶段是进行变量提高的一个过程【JavaScript变量提高运行机制】。测试
而后编译器会生成引擎运行时须要的代码。生成代码用来处理赋值的操做。ui
引擎运行时,首先会询问当前做用域是否有一个变量number,若是有直接使用这个变量。若是没有,引擎会继续查询该变量。直至最外层(全局做用域)。若是引擎找到变量number,就将1这个值赋给number,反之引擎会抛出一个异常。spa
详情完整的JavaScript的代码运行机制,请看这里。code
正常的猜测"L"、"R"就是左边和右边,赋值操做的左边和右边,根据这个猜测,当变量出如今赋值操做的左侧是进行LHS查询,当再出现赋值操做的右边进行RHS查询。对象
console.log(number);
复制代码
这段代码对number的引用是一个RHS查询,这里number没有赋值任何值,(可能你会说,兄弟你这一行代码会报错,没有声明变量number,很差意思,打扰了举着栗子。)ip
number = 1;
复制代码
这里对number是一个LHS查询,引擎并不关心当前赋值的值是什么,只是想为 = 1 找到一个目标。作用域
LHS查询和RHS查询的含义是"赋值操做的左侧和右侧",并不必定是意味着是" = 赋值操做符的左侧和右侧"。赋值操做还有其余几种形式,所以在概念上最好将其理解为"赋值操做的目标是谁(LHS)"以及"谁是赋值操做的源头(RHS)"。 ----------摘抄《你不知道JavaScript上卷》
function func(number) {
console.log(number);
}
func(1);
复制代码
上面的代码既有LHR查询也有RHS查询,咱们一块儿来分析一下。
看似简单的一段代码执行,其中进行了不少的LHR查询和RHS查询,这就是引擎须要重复操做的动做。
function foo(a) {
var b = a;
console.log(a);
console.log(b);
return a + b;
}
var c = foo(2);
复制代码
参考【《你不知道JavaScript上卷》】