块级作用域里的变量外层作用域是无法访问,变量是指由let,const。
函数的形参和变量,内部函数是外层作用域无法访问,属于局部变量。变量是指由let,const,var,function声明的。

用var声明的变量会进行变量提升,提升到当前作用域的最顶部,其值是undefined,因此在变量前进行取值不会报错。
非严格模式下对没有用var关键字声明的变量语句之前进行RHS,报ReferenceError异常。如果是之后进行RHS,会先进行LHS,如果当前作用域还是全局作用域下都没有找到,会自动创建一个全局变量并返回,严格模式下LHR查询失败时,并不会创建一个全局变量并返回,报ReferenceError异常。
变量的访问权限问题:

4处RHS查询:

3处LHS查询:

function foo(a) {    var b = a;    return a + b}var c = foo(2)

示例:

注意:取值和赋值都是RHS,变量声明和形参是LHS;RHS和LHS发生在执行过程中。

执行过程:

编译过程:

var a = 1; 

示例:

JS属于编译语言,逐行执行;编译的过程分为三部分:

作用域分类: