当前位置: 首页 > Web前端 > JavaScript

从编译的角度学习scope!

时间:2023-03-26 21:40:20 JavaScript

的范围是什么?思维导图编译原理我们都认为js是一种动态语言,其实它是一种编译型语言,只是没有提前编译,编译后的结果无法移植到分布式系统中。编译过程在传统编译语言的过程程序中。一段源代码在执行之前要经过三个步骤,统称为“编译”。它们是:分词/词法分析、语法分析/语法分析、代码生成。1.分词和词法分析:词法单元:将一串字符分解成(对于编程语言而言)有意义的代码块,称为词法单元。分词和词法分析的主要区别:主要区别在于词汇单元的识别是以有状态的还是无状态的方式进行的。主要区别在于词汇单元的识别是以有状态还是无状态的方式执行的。2.parsing/parsing将词法单元流转换为抽象语法树。这棵树称为抽象语法树(AST)。3.代码生成将AST转换为可执行代码的过程称为代码生成。js编译发生的时间节点。JavaScript的编译过程不会发生在构建之前。大多数情况下,编译发生在代码执行前的几微秒内。编译的时候,js引擎会尽量优化性能。了解范围作用引擎负责整个JavaScript程序从头到尾的编译和执行过程。编译器负责语法分析和代码生成范围负责收集和维护由所有声明的标识符(变量)组成的一系列查询,并强制执行一套非常严格的规则来确定当前正在执行的代码的访问权限这些标识符。vara=2实际上,vara=2执行了2条语句。分别在编译器和引擎中。首先,编译器会进行正常的编译,即词法分析和语法分析。在最终的代码制作中,它会与作用域“通信”。声明变量。a=2的赋值操作是在引擎运行时进行的,通过作用域查找变量。如果最后没有找到,就会报错。总结:变量赋值操作会执行两个动作。首先,编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后运行时引擎会在作用域中寻找这个变量。如果可以找到,它将为其分配一个值。LHS和RHS查询引擎搜索变量分为LHS和RHS2。LHS查找然后尝试查找变量的容器本身,以便可以为其分配一个值。RHS是获取变量的源值。LHS和RHS的意思是“赋值运算的左边或右边”不是“=”特别注意:函数声明编译器可以在生成代码的同时处理声明和值的定义,例如,当引擎执行代码,它不会有专用于将函数值“分配”给变量的线程。函数在编译器声明阶段被赋值。engine和scope的对话1.小case2.小casescope嵌套的scope就像一个泡泡,一个大泡泡包裹着一个小泡泡,在小泡泡里找不到的变量会在大泡泡里找到。一步步往上看。当一个块或函数嵌套在另一个块或函数中时,就会发生作用域嵌套。因此,当在当前作用域中找不到变量时,引擎会继续在外层嵌套作用域中查找,直到找到该变量,或者到达最外层作用域(即全局作用域)。遍历嵌套作用域链的规则引擎开始从当前执行作用域搜索变量,如果没有找到,继续向上一级搜索。当到达最外层的全局范围时,无论是否找到,查找过程都会停止。异常的RHS查询,如果没有找到,会报错。RHS查询在所有嵌套作用域中都找不到需要的变量,引擎会抛出ReferenceError异常。如果找不到LHS查询,则声明一个变量当引擎执行LHS查询时,如果在顶层(全局范围)找不到目标变量,则会在全局范围内创建一个具有该名称的变量并返回给engine(非严格模式),严格模式还是报错。引擎会抛出另一种称为TypeError的异常来处理变量。undefined.xxx,vara=3;a()这是一个典型的滥用。总结:ReferenceError与作用域识别失败有关,而TypeError是作用域识别成功,但对结果的操作不合法或不合理。参考一下你不知道的js(上),其实就是读书笔记,哈哈哈。