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打造最佳用户体验的登录页面的实现代码
Jul 08 Javascript
Javascript遍历table中的元素示例代码
Jul 08 Javascript
javascript随机抽取0-100之间不重复的10个数
Feb 25 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
Apr 04 Javascript
彻底解决 webpack 打包文件体积过大问题
Jul 07 Javascript
详解A标签中href=&quot;&quot;的几种用法
Aug 20 Javascript
谈谈JS中的!!
Dec 07 Javascript
泛谈JS逻辑判断选择器 || &amp;&amp;
May 24 Javascript
轻松学习JavaScript函数中的 Rest 参数
May 30 Javascript
javascript实现fetch请求返回的统一拦截
Dec 22 Javascript
Vue使用v-viewer实现图片预览
Oct 21 Javascript
解决Vue项目中tff报错的问题
Oct 21 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
深入解析yii权限分级式访问控制的实现(非RBAC法)
2013/06/13 PHP
php 常用算法和时间复杂度
2013/07/01 PHP
五款PHP代码重构工具推荐
2014/10/14 PHP
可输入的下拉框
2006/06/19 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
再谈javascript原型继承
2014/11/10 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
详解AngularJS 模态对话框
2016/04/07 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
浅谈javascript alert和confirm的美化
2016/12/15 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
BootStrap TreeView使用实例详解
2017/11/01 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
Python的subprocess模块总结
2014/11/07 Python
python实现中文输出的两种方法
2015/05/09 Python
python flask中静态文件的管理方法
2018/03/20 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
python爬虫selenium和phantomJs使用方法解析
2019/08/08 Python
python 调试冷知识(小结)
2019/11/11 Python
python生成并处理uuid的实现方式
2020/03/03 Python
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
JPA的特点
2014/10/25 面试题
计算机应用与科学个人的自我评价
2013/11/15 职场文书
学校安全责任书范本
2014/07/23 职场文书
幼儿园三八妇女节活动总结
2015/02/06 职场文书