JS作用域理解

作用域内部原理的过程:

1.编译:编译过程将程序分解成词法单元,然后将词法单元解析成抽象语法树(AST),最后将AST转换成机器指令来等待执行的过程

2.执行:   引擎运行代码时,首先查找当前作用域是否含有该变量,如果在,则就会直接使用该变量,否则引擎还会继续查找直到查到该变量然后进行操作(比如赋值),如果找不到则会抛出异常

3.查询:当如果执行赋值操作,就会使用LHS查询,如果是函数调用的时候就会用RHS查询

4.嵌套:查找机制是从内到外进行不断查找,在当前作用域下无法找到某个变量时,就会在外层嵌套的作用域中继续查找,知道找到该变量,或者是抵达最外层作用域也就是全局作用域为止

5.异常:在查询中如果有未声明的变量之类的就会报错

作用域:

1.词法作用域

☆ 遮蔽: 在多重嵌套作用域中,可以定义同名字的标识符,这就叫做遮蔽效应

☆ 变量的声明提升(在js中是边解释边执行的,无编译阶段): 在遇到有var的变量声明的时候会提升到最前面,也就是预解释过程中的变量提升,就是提前解释好

☆ 函数的声明提升,function() {}可以提升,var x = function () {}无法提升,var x = function abc() {}具名也无法提升

注意:变量的声明优先于函数的声明,但是函数的声明会覆盖未定义的同名的变量,如果是已定义的变量,则不会覆盖

原文地址:https://www.cnblogs.com/xzsblog/p/13110851.html