javaScript -- 日志 -- "作用域"(1)

113 阅读3分钟

开篇:你好,时间的朋友,本人前端"搬砖人"一枚,搬砖快5年了,大大小小做过不少项目,前段时间忽然有个疑问:“你搬砖那个长时间,你到底沉淀下了多少东西?”,我想了想,我会JS、HTML、Vue、React...,好像很多;第二个问题:“你真正深入了解的多少?”,额...,我只能说"平常工作够用(很虚心)",真的不敢说我"精通"或者"非常熟悉",哎,也混了那么多年,感觉很惭愧,所以就决定深入研究一下这些东西,写下我的见解,有什么不正确的地方,大家多多指正,共同进步

正文

  • 开始谈作用域之前,我觉得我们需要理解javaScript是怎么编译的
    1. 有使用过javaScript进行开发项目的差不多都知道,javaScritp是一种"解释型"或者"动态"(javascript的编译过程不是发生在构建之前)语言
    2. 一般情况下,程序中的一段代码在执行之前都会经历这几个步奏:词法分析=>语法分析=>代码生成
    • 词法分析:如var a = 10;,通常会被分解成:var, a , = , 10, ;的词法单元,这些词法单元一起组成一个词法单元流(可以理解成一个数组)
    • 语法分析:将词法单元流(可以理解成一个数组)转换成一个逐级嵌套的代表程序语法结构的树,就是“抽象语法树”
    • 代码生成:就是将“抽象语法树”转换成可执行代码
  • 什么是作用域?
    1. 通过上面的了解,发现作用域就是一套精准有序的 规则,由于javaScript是“动态”的,所有就没有时间来进行优化(并不代表javaScript没有优化,如JIT:可以延迟编译或重新编译),大部分情况下,编译一般发生在代码执行前很短的时间内
  • 那作用域是如何工作的呢?
    1. 我们需要理解引擎(从头到尾负责js编译和执行过程),编译器(负责语法分析和代码生成),作用域(负责声明和维护由所有声明组成的一系列查询),下图是我的理解

1.png

  1. 然后编译器会为引擎生成运行的时候所需要的代码,再然后,引擎运行的时候会先询问对应的作用域,如果找到a就执行,否则继续向上层作用域查找,找到为止( 作用域的嵌套 ),如果没有找到就会抛出异常
  • 关于LHS查询和RHS查询
    1. 例如var b = 100; var a = b;对于var a =来说,就是LHS查询(可以理解为a就是要查找的目标),对 =b来说,就是RHS查询(可以简单理解为“源”,要查找的源头(本例中为100)) 结束语 由于是抽时间写的,写的不是很详细,如果感觉还可以,多多关注;下次再见,时间的朋友