作用域内部原理的过程:
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