JavaScript var声明变量背后的原理示例解析


Posted in Javascript onOctober 12, 2013

只要是写过点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函数
Nov 20 Javascript
javascript利用控件对windows的操作实现原理与应用
Dec 23 Javascript
jquerymobile局部渲染的各种刷新方法小结
Mar 05 Javascript
javascript教程:关于if简写语句优化的方法
May 17 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
May 06 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
Aug 13 Javascript
JavaScript中boolean类型之三种情景实例代码
Nov 21 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
Dec 11 jQuery
jquery实现动态创建form并提交的方法示例
May 27 jQuery
JavaScript数组排序的六种常见算法总结
Aug 18 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
Nov 18 jQuery
JavaScript使用canvas绘制坐标和线
Apr 28 Javascript
原生js操作checkbox用document.getElementById实现
Oct 12 #Javascript
基于jquery的9行js轻松实现tab控件示例
Oct 12 #Javascript
JavaScript对象学习经验整理
Oct 12 #Javascript
js修改input的type属性问题探讨
Oct 12 #Javascript
5秒后跳转到另一个页面的js代码
Oct 12 #Javascript
设置checkbox为只读(readOnly)的两种方式
Oct 11 #Javascript
extjs表格文本启用选择复制功能具体实现
Oct 11 #Javascript
You might like
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
PHP定时任务延缓执行的实现
2014/10/08 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
鼠标划过实现延迟加载并隐藏层的js代码
2013/10/11 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
node.js中的path.normalize方法使用说明
2014/12/08 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
微信小程序 登录的简单实现
2017/04/19 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
2017/09/21 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
js实现全选和全不选
2020/07/28 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
总结Python编程中函数的使用要点
2016/03/20 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
python之生成多层json结构的实现
2020/02/27 Python
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
标记环网Toke Ring IEEE802.5
2014/05/26 面试题
中药专业大学生医药工作求职信
2013/10/25 职场文书
业务代表的岗位职责
2013/11/16 职场文书
小学清明节活动总结
2014/07/04 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
2014年英语教学工作总结
2014/12/17 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
话题作文之生命的旋律
2019/12/17 职场文书