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 相关文章推荐
jQuery 表单验证扩展(四)
Oct 20 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
Jun 15 Javascript
输入框过滤非数字的js代码
Sep 18 Javascript
详解JavaScript中的forEach()方法的使用
Jun 08 Javascript
JS获取数组最大值、最小值及长度的方法
Nov 24 Javascript
CSS3 media queries结合jQuery实现响应式导航
Sep 30 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
Dec 31 Javascript
详解vue之页面缓存问题(基于2.0)
Jan 10 Javascript
JavaScript实现隐藏省略文字效果的方法
Apr 27 Javascript
微信小程序点击控件修改样式实例详解
Jul 07 Javascript
使用jQuery动态设置单选框的选中效果
Dec 06 jQuery
Javascript实现单选框效果
Dec 09 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
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
laravel多条件查询方法(and,or嵌套查询)
2019/10/09 PHP
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
jQuery事件用法实例汇总
2014/08/29 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
JQuery导航菜单选择特效
2016/04/11 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
在Python的Django框架中创建和使用模版
2015/07/15 Python
使用Python中的tkinter模块作图的方法
2017/02/07 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
Python实现图像的垂直投影示例
2020/01/17 Python
如何利用Python 进行边缘检测
2020/10/14 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
2021/02/01 Python
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
init进程的作用
2015/08/20 面试题
儿科护士自我鉴定
2013/10/14 职场文书
好的旅游活动方案
2014/08/19 职场文书
群教班子对照检查材料
2014/08/26 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
确保工程质量承诺书
2015/04/29 职场文书
初中语文教学随笔
2015/08/15 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
Kubernetes控制节点的部署
2022/04/01 Servers