JS声明变量背后的编译原理剖析


Posted in Javascript onDecember 28, 2012

只要是写过点JS代码,很简单一个var 就完事了。那对于JS编译器背后它又发生了什么呢?那就一步步通过代码来讲起。

x = 1; 
alert(x); 
var y = function() { 
alert(x); 
var x = 2; 
alert(x); 
} 
y();

上面的代码也会你答对了它会分别输出:1,undefined,2。对于我来说,第一反应它会输出:1,1,2。为什么第二个会输出undefined?在上面我明确定义了一个全局变量x,为何找不到?

那是因为:js编译器在执行这个y函数的时候,会把把它body里面的声明变量提前到最前面进行声明。比如:var x=2; 编译器先会在body最前面进行var x 声明。其实上面的代码等同于下面的这段代码:

x = 1; 
alert(x); 
var y = function() {<BR>var x;//此时x还未赋值,所以为undefined。 
alert(x); 
x = 2; 
alert(x); 
} 
y();

所以也就不难理解x=undefined的了.但是如果把var x = 2;这段代码给删掉,在内部它没有进行var声明。它会一直沿着作用域向上找,此时的x 就为全局x.
接下来再看一个更有趣的例子。
var a = 1; 
function b() { 
a = 10; 
return; 
} 
b(); 
alert(a); 
/////////////////////////////////// 
var a = 1; 
function b() { 
a = 10; 
return; 
function a() {} 
} b(); alert(a);

例子很简单。第一个例子为输出10,第二个会输出1。这是为什么呢?况且第二个例子我都return 了。按理都应当输出10才对呀!那时因为JS编译器在背后作怪。
两段代码差别就是第二个例子多了个function a(){};便这个函数体里面什么也没有,并且也没有对它进行任何调用。

其实JS编译器在背后会把function a() {}编译成 var a=function (){}。此时对于函数内部也有一个a=10; 外面的a些也还是1;根据JS作用域。会先找内部的a,如果找不到再向上一级一级找。
最张alert(a) 就会显示1;

Javascript 相关文章推荐
JS 获取浏览器和屏幕宽高等信息代码
Mar 31 Javascript
详解JavaScript ES6中的Generator
Jul 28 Javascript
jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
Dec 08 Javascript
jquery基础知识第一讲之认识jquery
Mar 17 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
May 03 Javascript
JavaScript 过滤关键字
Mar 20 Javascript
详解http访问解析流程原理
Oct 18 Javascript
JavaScript防止全局变量污染的方法总结
Aug 02 Javascript
详解Vue中watch的详细用法
Nov 28 Javascript
JS将时间秒转换成天小时分钟秒的字符串
Jul 10 Javascript
vue组件开发之slider组件使用详解
Aug 21 Javascript
JavaScript实例 ODO List分析
Jan 22 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
Dec 28 #Javascript
2012年开发人员的16款新鲜的jquery插件体验分享
Dec 28 #Javascript
web性能优化之javascript性能调优
Dec 28 #Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
Dec 28 #Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
Dec 28 #Javascript
Javascript 加载和执行-性能提高篇
Dec 28 #Javascript
javascript延时加载之defer测试
Dec 28 #Javascript
You might like
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
PHP 中文处理技巧
2010/04/25 PHP
php通过排列组合实现1到9数字相加都等于20的方法
2015/08/03 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
jquery 插件开发方法小结
2009/10/23 Javascript
理解JavaScript中的对象 推荐
2011/01/09 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
Angular 4.x中表单Reactive Forms详解
2017/04/25 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
[46:14]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
跟老齐学Python之list和str比较
2014/09/20 Python
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
Python入门教程之if语句的用法
2015/05/14 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
美国第一香水网站:Perfume.com
2017/01/23 全球购物
StubHub西班牙:购买和出售全球活动门票
2017/06/05 全球购物
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
Lookfantastic台湾:英国彩妆美发保养购物网
2018/03/26 全球购物
上海奥佳笔试题面试题
2016/11/16 面试题
资产经营总监岗位职责
2013/12/04 职场文书
见习期自我鉴定
2014/01/31 职场文书
设计顾问服务计划书
2014/05/04 职场文书
Golang map映射的用法
2022/04/22 Golang