浅析JavaScript预编译和暗示全局变量


Posted in Javascript onSeptember 03, 2020

1. 暗示全局变量

未声明的变量称为暗示全局变量。

var a = 1; //函数体外声明的变量称为全局变量
b = 2; // 无论函数体外或函数体内未声明的变量都称为暗示全局变量
function fn() {
 var c = 3; //函数体内声明的变量称为局部变量
 d = 4; // 暗示全局变量
}
fn(); // 若不执行函数,则不会进行函数预编译,d 就不会提升为全局变量
console.log(c); // error: c is not defined
console.log(d); // 4

2. JavaScript执行过程

1. 语法分析,若存在低级语法错误,则不编译执行;
2. 预编译,包括变量声明提前和函数声明提前;
3. 解释执行,解释一行,执行一行。

3. 预编译

预编译可分为全局预编译和函数预编译。

预编译可分为全局预编译和函数预编译。

1. 在js脚本加载之后,会先通篇检查是否存在低级错误;
2. 在语法检测完之后,便进行全局预编译;
3. 在全局预编译之后,就解释一行,执行一行;
4. 当执行到函数调用那一行,会先进行函数预编译,再往下执行。

全局预编译:

1. 创建全局对象GO(window对象);
2. 变量声明提前,将所有变量的声明放到最前面,作为GO对象的属性,
并赋值undefined,若存在变量名相同,只声明一个;
3. 函数声明提前,将函数声明也放到最前面,作为GO对象的属性,
若函数名与变量名相同,变量名会被函数名覆盖,值是函数体。
这就是函数定义放到函数调用之前或之后都可以的原因。

函数预编译:

1. 在函数执行前的一瞬间,函数预编译闪亮登场;
2. 先创建一个AO对象(Active Object);
3. 将形参和变量声明提前,赋值undefined,作为AO的属性;
4. 将实参赋值给形参;
5. 函数声明提前,值为函数体,作为AO的属性。

栗子:

var a = 1;
function b(c){
 console.log(c);
 var c = 2;
 console.log(c);
 function c() {}
 var d = 3;
 function e() {}
}
b(4);

先分析全局预编译,

  • 创建GO对象,GO = {};
  • 变量声明提前
// 伪代码
GO = { 
 a = undefined
}
  • 函数声明提前
// 伪代码
GO = { 
 a = undefined
 b = f b(c) { console.log(c); ... }
}

再分析函数预编译,

  • 创建AO对象,AO = {};
  • 形参和变量声明提前;

// 伪代码
AO = { 
c = undefined // 与变量名相同,只声明一个
d = undefined
}
  • 将实参赋值给形参;
// 伪代码
AO = { 
c = 4 // b(4),传入的实参是4
d = undefined
}

  • 函数声明提前

// 伪代码
AO = { 
c = f c() {} // 函数名会覆盖变量名
d = undefined
e = f e() {}
}

所以第一次打印变量c的时候,是输出函数体,而不是实参4。

以上就是浅析JavaScript预编译和暗示全局变量的详细内容,更多关于JavaScript预编译和暗示全局变量的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
jQuery TextBox自动完成条
Jul 22 Javascript
JavaScript 对象链式操作测试代码
Apr 25 Javascript
将input file的选择的文件清空的两种解决方案
Oct 21 Javascript
推荐4个原生javascript常用的函数
Jan 12 Javascript
JavaScript返回上一页的三种方法及区别介绍
Jul 04 Javascript
jquery实现表单验证简单实例演示
Nov 23 Javascript
jQuery解析返回的xml和json方法详解
Jan 05 Javascript
基于JavaScript实现轮播图原理及示例
Apr 10 Javascript
微信小程序实现弹出菜单功能
Jun 12 Javascript
jquery实现的简单轮播图功能【适合新手】
Aug 17 jQuery
layui中的switch开关实现方法
Sep 03 Javascript
js实现整体缩放页面适配移动端
Mar 31 Javascript
详解JavaScript作用域、作用域链和闭包的用法
Sep 03 #Javascript
JS变量提升及函数提升实例解析
Sep 03 #Javascript
Vue自定义组件双向绑定实现原理及方法详解
Sep 03 #Javascript
Vue js with语句原理及用法解析
Sep 03 #Javascript
Vue通过provide inject实现组件通信
Sep 03 #Javascript
Vue组件通信$attrs、$listeners实现原理解析
Sep 03 #Javascript
Vue父组件监听子组件生命周期
Sep 03 #Javascript
You might like
超级简单的发送邮件程序
2006/10/09 PHP
杏林同学录(五)
2006/10/09 PHP
php 图片上传类代码
2009/07/17 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
2016/11/22 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
JavaScript入门教程(9) Document文档对象
2009/01/31 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
jquery显示和隐藏div特效实例
2013/02/27 Javascript
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
Python中字符串的常见操作技巧总结
2016/07/28 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
python+POP3实现批量下载邮件附件
2018/06/19 Python
pyttsx3实现中文文字转语音的方法
2018/12/24 Python
django 配置阿里云OSS存储media文件的例子
2019/08/20 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
Haggar官网:美国男装品牌
2020/02/16 全球购物
好的演讲稿开场白
2013/12/30 职场文书
房地产财务部员工岗位职责
2014/03/12 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
机电一体化专业求职信
2014/07/22 职场文书
实现中国梦思想汇报2014
2014/09/13 职场文书
迟到检讨书范文
2015/01/27 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
mysql知识点整理
2021/04/05 MySQL
OpenCV实现常见的四种图像几何变换
2022/04/01 Python
Nginx速查手册及常见问题
2022/04/07 Servers