编译与执行
Javascript引擎会在词法分析和代码生成阶段对运行性能进行优化,包含对冗余元素进行优化(例如对语句在不影响结果的情况下进行重新组合)。
对于Javascript来说,大部分情况下编译发生在代码执行前的很短时间内,涉及的概念有引擎、编译器、作用域。
变量声明例如var a = 2这条表达式,编译阶段会先查询作用域是否有同名变量,如果有就忽略声明(仅仅忽略var的声明),继续编译。如果没有,会在当前作用域的变量集合中创建一个变量,命名为a。
{ //编译阶段找不到a 执行var a var a = 1; //运行阶段执行 a = 1 console.log(a); //1 //编译阶段找到了变量a 忽略此条语句 var a = 2; //运行阶段执行 a = 2 console.log(a); //2 }
LHS查询与RHS查询
当变量被使用时,会进行查询操作,例如赋值操作a = 1是LHS查询,另外一种称为RHS查询。
简单理解就是,对于赋值操作(包括隐性的)为LHS,作为变量进行引用时时RHS查询。
{ //赋值操作 LHS查询 var a = 1; function fn(a) { //进入函数体存在一个隐性的a = 2操作 //log使用RHS查询 console.log(a); } //函数调用发生RHS查询 2作为引用传入 fn(2); }
作用域嵌套
一个块或函数嵌套在另一个块或函数中时,就会形成作用域嵌套,在当前作用域无法找到某个变量时,就会在外层作用域继续查找,直到找到该变量;或者没找到,抛出一个错误,查询停止。
原文:http://www.cnblogs.com/QH-Jimmy/p/6444185.html