作用域

------------>作用域

       因为javascript编译的过程分为了3步

        1.词法分析,也叫单词拆解,比如  var t=2;那么就变成了 var , t ,= , 2;

        2.语义分析  比如上面那个就变成了一个抽象树,类似lamda表达式中的数

        3.代码生成  将上面生成的数据流转换成对应的机器代码,一般来说就是为上面生成的变量生成内存

    总结:变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如
    果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对
    它赋值。

------------->查询

        1.LHS  也就是一般说的"="左边

        2.RHS  等号右边,也就是一般说的源

        考虑下面代码:     

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

        上面的代码发生了几次LHS/RHS?

        LHS:a=2,b=a  -->2次

        RHS:foo(),b=a,console,b,a,console.log(a)   -->6次

      考虑下上面所说的语法分析阶段,那么我们是不是可以说变量在生产之前就已经存在某个作用域中了!!!

------------->嵌套作用域

      考虑下面的代码

function foo(a){
   console.log(a+b);//6
}
var b=3;
foo(3);

       这个就是一个简单的嵌套作用域的例子,我们可以看出在foo的函数作用域中并没有变量b

          但是执行foo(3)又没有报错,这就说明b是在全局作用域中找到的

Hold on, everything is possible.
原文地址:https://www.cnblogs.com/student-note/p/6631960.html