博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
摘记总结(1)
阅读量:5718 次
发布时间:2019-06-18

本文共 999 字,大约阅读时间需要 3 分钟。

传统编译语言中,程序中的一段源代码在执行前会经过3个步骤,这三个步骤统称为编译

  1。分词/词法分析: 将代码分割分解成对这门语言有意义的代码块
  2。解析/语法分析: 将这些代码块组成一个程序语法树,有点类似与浏览器解析时候生成dom树
  3。代码生成: 转化为机器可识别的代码

 

例,var a = 2

  这个赋值操作我们一般是这样理解: 申明一个a变量,为它分配一个内存,然后将2的值保存进内存里面

编译器和引擎的实际操作是
  当遇到var a 的时候,编译器会问作用域,是否已经存在a这个变量,如果没有就在作用域中声明a变量
  如果有就继续下一步(同级作用域中后面声明的同名变量会被忽略,我之前的理解是后面声明的同名变量会覆盖前面声明的变量,其实这个要分两块来理解,一个是声明部分,一个是赋值部分;准确来说应该是:对于同一个作用域中的{var a = 1;var a = 2},对变量a的声明,后者的声明会被忽略,因为之前已经声明过了,对a的赋值操作,后者还是会正常执行,2就会取代原来在内存中的1,也就是我原来理解的覆盖。,然后编译器生成引擎执行所需的代码,也就是赋值操作,引擎会问作用域是否存在

a变量,引擎会在作用域中查询,如果有就把2保存进去,如果没有就继续查询(这里设计到作用域链),查完之后还没有就会抛出异常报错。

 

(JavaScript引擎会在代码执行前对其进行编译)

编译器生成代码后,引擎开始执行代码,例如 a = 2 这个赋值操作代码,引擎是如何去找到a 和 2的
用的就是
LHS和RHS查询

他们两的含义是赋值操作的左侧查询和右侧查询

LHS查询可以理解为针对“目标“的查询,例如 a = 2 这个赋值操作,LHS查询是针对a这个目标进行查询,要将2赋值给a,那么需要通过LHS查询去看看a变量存不存在(在非严格模式中如果没有声明a就去赋值,引擎是会自动声明a不会报错,但是严格模式下就会报错了)
RHS查询可以理解为针对“源”的查询,例如a = b ,RHS查询是要去查询b这个源,要通过RHS查询去看看b变量是什么,是个基本类型还是引用类型

词法作用域:

是一种作用域的工作模式,
在编译阶段的词法分析阶段,会根据代码的词法位置来生成对应的作用域

转载于:https://www.cnblogs.com/jjucap/p/9837717.html

你可能感兴趣的文章
git 提交返回信息乱码_Emoji-Log:编写 Git 提交信息的新方法
查看>>
httpresponse结果返回map_C++与STL入门(5):映射map
查看>>
java中类名.class_Java类加载机制
查看>>
mysql唯一索引效率_mysql笔记系列(七)唯一索引和普通索引的性能区别
查看>>
mysql5.7主从全备恢复_mysql5.7主从同步配置
查看>>
mysql 5.7.19主从复制_MySQL5.7.19 - 主从复制 - 日志点
查看>>
网络安全态势感知 提取 理解和预测 杜嘉微_网络安全态势感知综述(二)
查看>>
bash给脚本加进度条_shell脚本实现进度条以及应用场景
查看>>
servlet存入mysql乱码_解决servlet中的乱码问题
查看>>
mysql 3523 redo_MySQL 持久化保障机制-redo 日志
查看>>
proxool mysql_proxool 连接mysql数据库的配置(web.xml) 以及简单的测试连接
查看>>
rocketmq存储消息mysql_RocketMQ 分布式事务消息
查看>>
用户态到内核态的转换的具体流程_Linux内核分析-系统调用用户态到内核态流程(四)...
查看>>
编程实现让单片机在lpm0模式下_奥运倒计时器,请看单片机如何编程实现
查看>>
docker进入容器安装东西的目录_Jenkins 在 docker 容器中安装
查看>>
python多包运行_Python-包的运行
查看>>
python打印机html css_python学习HTML之CSS(2)
查看>>
python的内存回收机制原理_python的内存管理和垃圾回收机制详解
查看>>
ubuntu 转mysql_【转】ubuntu 下安装mysql
查看>>
druid mysql 版本_Druid连接池错误(数据库版本问题)
查看>>