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

js预编译

总结:

1.未经声明的变量归window所有,全局声明的变量为window一个属性

2.三步曲,对比函数预编译仅仅缺少形参实参统一:

    (1)生成一个GO对象 (Global Object)  GO ===window

    (2)找变量声明,将变量声明名作为GO属性名,值为undefined

    (3)找函数声明,值赋予函数体,注意不是函数表达式

global = 100;
function fn(){
	console.log(global);
	global = 200;
	console.log(global);
	var global = 300;
}
fn();
var global;

结果为

a=100;
console.log(demo)
function demo(e){
	function e(){}
	arguments[0] =2;
	console.log(e);
	if(a){
		var b = 123;
		function c(){
			//...
		}
	}
	var c;
	a=10;
	var a;
	console.log(b);
	f=123;
	console.log(c);
	console.log(a);
}
var a;
demo(1);
console.log(a);
console.log(f);

预编译 

1.首先生成GO
2.找变量声明 var a 赋值 undefined
   GO{
        a:undefined
   }
3.找函数声明 function demo(){...} 赋值函数体
   GO{
        a:undefined
        demo:function demo(){...}
   }

执行

1.a=100 改变GO中a的值
  GO{
        a:100
        demo:function demo(){...}
   }
2.console.log(demo) 打印function demo(e){...}
3.跳过函数声明,跳过 var a
4.demo(1) 执行函数前先函数预编译

  函数预编译
  1.生成AO{}
  2.形参和变量声明赋值为undefined
   AO{
     e:undefined
     b:undefined
     c:undefined
     a:undefined
   }
  3.形参实参统一
   AO{
     e:1
     b:undefined
     c:undefined
     a:undefined
   }
  4.函数声明
   AO{
     e:function e(){}
     b:undefined
     c:undefined
     a:undefined
   }
   新标准if(){}中不可以定义函数,所以此处c未改变

   编译完成执行函数
   4-1.跳过function e(){}
   4-2.arguments[0] =2;  arguments[0]与形参e映射,虽为两个个体,值改变时另一个改变
   AO{
     e:2
     b:undefined
     c:undefined
     a:undefined
   }
   4-3.console.log(e) 结果为2
   4-4.if(a)条件不成立 不执行
   4-5.跳过var c;
   4-6.a=10;a赋值为10
   AO{
     e:2
     b:undefined
     c:undefined
     a:10
   }
   4-7.console.log(b) 结果为undefined
   4-8.f=123;未声明的变量为window的属性,GO中f赋值为123
      GO{
        a:100
        demo:function demo(){...}
        f:123
      }
   4-9.console.log(c) 结果为undefined
   4-10.console.log(a) 结果为10

5.console.log(a) 结果为100
6.console.log(f) 结果为123

 

结果为

 

相关文章:

  • js----函数之立即执行函数
  • 闭包问题
  • js --- 面向对象之原型与原型链
  • 对象枚举以及判断数组与对象的3种方法
  • git的小白入门
  • windows如何配置mysql的环境变量
  • js的变量类型判断和类型的转换
  • vscode 常用设置和插件
  • 可迭代对象和类数组
  • js数组遍历方法总结与对比
  • PAT乙级 我要通过(1003)的详细解答过程
  • PAT乙级 成绩排名(1004) c++题解
  • PAT乙级 继续(3n+1)猜想(1005) c++题解(打表越界的段错误)
  • PAT乙级 素数对猜想(1007)c++实现
  • PAT乙级 说反话(1009)c++新手易懂版
  • 【5+】跨webview多页面 触发事件(二)
  • 【剑指offer】让抽象问题具体化
  • eclipse的离线汉化
  • Java反射-动态类加载和重新加载
  • spring学习第二天
  • SSH 免密登录
  • ubuntu 下nginx安装 并支持https协议
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 简析gRPC client 连接管理
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 每天一个设计模式之命令模式
  • 前端技术周刊 2019-02-11 Serverless
  • 网络应用优化——时延与带宽
  • Semaphore
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • (超详细)语音信号处理之特征提取
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (七)理解angular中的module和injector,即依赖注入
  • (四)JPA - JQPL 实现增删改查
  • (转)关于pipe()的详细解析
  • (轉)JSON.stringify 语法实例讲解
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET DataGridView数据绑定说明
  • .NET Micro Framework初体验(二)
  • .NET MVC 验证码
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .Net7 环境安装配置
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @ConditionalOnProperty注解使用说明
  • [ IO.File ] FileSystemWatcher
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [Android 13]Input系列--获取触摸窗口