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 相关文章推荐
jqTransform form表单美化插件使用方法
Jul 05 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
Nov 25 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
Jun 09 Javascript
JavaScript文本框脚本编写的注意事项
Jan 25 Javascript
浅谈js中的变量名和函数名重名
Feb 13 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
Mar 30 jQuery
微信小程序图片横向左右滑动案例
May 19 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
Sep 14 Javascript
微信小程序学习笔记之本地数据缓存功能详解
Mar 29 Javascript
浅谈一个webpack构建速度优化误区
Jun 24 Javascript
微信小程序 导入图标实现过程详解
Oct 11 Javascript
JavaScript运动原理基础知识详解
Apr 02 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冒泡排序算法的深入理解
2013/06/09 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
PHP内存缓存Memcached类实例
2014/12/08 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
2015/01/04 PHP
PHP保存带BOM文件的方法
2015/02/12 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
超级强大的表单验证
2006/06/26 Javascript
用javascript获取textarea中的光标位置
2008/05/06 Javascript
JavaScript 快捷键设置实现代码
2009/03/13 Javascript
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
学习JavaScript的最佳方法分享
2011/10/21 Javascript
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
解决给dom元素绑定click等事件无效问题的方法
2017/02/17 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
详解vue-cli3使用
2018/08/14 Javascript
Python中使用logging模块打印log日志详解
2015/04/05 Python
python判断windows系统是32位还是64位的方法
2015/05/11 Python
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
python matplotlib库的基本使用
2020/09/23 Python
Clarks鞋法国官方网站:英国其乐鞋品牌
2018/02/11 全球购物
c语言常见笔试题总结
2016/09/05 面试题
目标责任书范文
2014/04/14 职场文书
百日安全活动总结
2014/05/04 职场文书
房地产置业顾问岗位职责
2015/04/11 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
国际最新研究在陨石中发现DNA主要成分 或由陨石带来地球
2022/04/29 数码科技