开篇:你好,时间的朋友,本人前端"搬砖人"一枚,搬砖快5年了,大大小小做过不少项目,前段时间忽然有个疑问:“你搬砖那个长时间,你到底沉淀下了多少东西?”,我想了想,我会JS、HTML、Vue、React...,好像很多;第二个问题:“你真正深入了解的多少?”,额...,我只能说"平常工作够用(很虚心)",真的不敢说我"精通"或者"非常熟悉",哎,也混了那么多年,感觉很惭愧,所以就决定深入研究一下这些东西,写下我的见解,有什么不正确的地方,大家多多指正,共同进步
正文
- 开始谈作用域之前,我觉得我们需要理解javaScript是怎么编译的
- 有使用过javaScript进行开发项目的差不多都知道,javaScritp是一种"解释型"或者"动态"(javascript的编译过程不是发生在构建之前)语言
- 一般情况下,程序中的一段代码在执行之前都会经历这几个步奏:词法分析=>语法分析=>代码生成
- 词法分析:如
var a = 10;
,通常会被分解成:var, a , = , 10, ;
的词法单元,这些词法单元一起组成一个词法单元流(可以理解成一个数组) - 语法分析:将词法单元流(可以理解成一个数组)转换成一个逐级嵌套的代表程序语法结构的树,就是“抽象语法树”
- 代码生成:就是将“抽象语法树”转换成可执行代码
- 什么是作用域?
- 通过上面的了解,发现
作用域
就是一套精准有序的规则
,由于javaScript是“动态”的,所有就没有时间来进行优化(并不代表javaScript没有优化,如JIT:可以延迟编译或重新编译),大部分情况下,编译一般发生在代码执行前很短的时间内
- 通过上面的了解,发现
- 那作用域是如何工作的呢?
- 我们需要理解引擎(从头到尾负责js编译和执行过程),编译器(负责语法分析和代码生成),作用域(负责声明和维护由所有声明组成的一系列查询),下图是我的理解
- 然后编译器会为引擎生成运行的时候所需要的代码,再然后,引擎运行的时候会先询问对应的作用域,如果找到a就执行,否则继续向上层作用域查找,找到为止( 作用域的嵌套 ),如果没有找到就会抛出异常
- 关于LHS查询和RHS查询
- 例如
var b = 100; var a = b;
对于var a =
来说,就是LHS查询(可以理解为a就是要查找的目标),对=b
来说,就是RHS查询(可以简单理解为“源”,要查找的源头(本例中为100)) 结束语 由于是抽时间写的,写的不是很详细,如果感觉还可以,多多关注;下次再见,时间的朋友
- 例如