当前位置: 首页 > news >正文

js关于函数预编译的研究

前言:js执行过程为分为3步 

  1.   语法分析:通篇扫描有无语法错误 如中文符号或者缺少大括号
  2.   预编译:函数声明整体提升,变量 声明提升
  3.   解释执行

总结:函数预编译为4部曲,预编译发生在函数执行的前一刻

1.创建 AO 对象

2.找形参和变量声明,将形参和变量作为AO属性名,值为undefined

3.将实参值和形参统一

4.在函数体里面找函数声明,值赋予函数体

 

举例解释说明,更好理解

function fn(a){
	console.log(a);
	
	var a=123;
	console.log(a);

	function a(){}
	console.log(a);

	var b = function (){}
	console.log(b);

	function d(){}
}
fn(1)

预编译过程:

第一步 生成一个AO对象, AO{ }

第二步 :

   1.先找到 形参a ,添加新属性a ,赋值undefined,此时  AO -> AO {  a:undefined  }

   2.接下来  var a , AO对象已有a属性, 不用操作

   3.发现 var b , 添加新属性b , 赋值undefined,此时  AO -> AO {  a:undefined  , b:undefined }

第三步:

  将实参1与形参统一  ,此时  AO -> AO {  a:1 ,b:undefined }

第四步:

   1.发现函数声明 function a(){} ,AO对象已有a属性,更改值为函数体,此时 AO ->  AO {  a:function a(){}  , b:undefined }

   2.发现函数声明 function d(){} ,此时 AO  ->  AO {  a:function a(){}  , b:undefined ,d:function d(){}  , }

执行函数体过程:

   1. console.log(a) ,去AO对象寻找a, 打印结果为 function a(){}

   2. var a=123, var a已经预编译 ,只执行  a=123, 此时AO->  AO {  a:123 , b:undefined ,d:function d(){}  , }

   3.console.log(a) ,去AO对象寻找a ,打印结果为 123

   4.function a(){} 已经预编译 ,跳过

   5.console.log(a) ,去AO对象寻找a ,打印结果不变仍为 123

   6. var b = function () {} ,var b已经预编译 ,只执行  b=function () {}, 此时AO->  AO {  a:123 , b:function () {} ,d:function d(){}  , }

   7.console.log(b) ,去AO对象寻找b ,打印结果为 function (){}

   8. function d() {} 已经预编译 ,跳过

打印结果为:

如有错误,欢迎各位大佬指正

相关文章:

  • js预编译
  • js----函数之立即执行函数
  • 闭包问题
  • js --- 面向对象之原型与原型链
  • 对象枚举以及判断数组与对象的3种方法
  • git的小白入门
  • windows如何配置mysql的环境变量
  • js的变量类型判断和类型的转换
  • vscode 常用设置和插件
  • 可迭代对象和类数组
  • js数组遍历方法总结与对比
  • PAT乙级 我要通过(1003)的详细解答过程
  • PAT乙级 成绩排名(1004) c++题解
  • PAT乙级 继续(3n+1)猜想(1005) c++题解(打表越界的段错误)
  • PAT乙级 素数对猜想(1007)c++实现
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 0基础学习移动端适配
  • CSS中外联样式表代表的含义
  • fetch 从初识到应用
  • git 常用命令
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • js继承的实现方法
  • MaxCompute访问TableStore(OTS) 数据
  • MQ框架的比较
  • Octave 入门
  • Python学习笔记 字符串拼接
  • Redis的resp协议
  • TCP拥塞控制
  • vuex 笔记整理
  • 从零开始学习部署
  • 回顾2016
  • 前端js -- this指向总结。
  • 区块链将重新定义世界
  • 手写一个CommonJS打包工具(一)
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 阿里云ACE认证学习知识点梳理
  • 积累各种好的链接
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (11)MATLAB PCA+SVM 人脸识别
  • (Java)【深基9.例1】选举学生会
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (二)springcloud实战之config配置中心
  • (七)c52学习之旅-中断
  • (转) Android中ViewStub组件使用
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .Net中wcf服务生成及调用
  • .Net中间语言BeforeFieldInit
  • :如何用SQL脚本保存存储过程返回的结果集
  • ?php echo ?,?php echo Hello world!;?
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @Repository 注解