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中将多个语句写成一个语句的两种方法小结
Dec 08 Javascript
11款基于Javascript的文件管理器
Oct 25 Javascript
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
Jan 24 Javascript
JavaScript中的alert()函数使用技巧详解
Dec 29 Javascript
JavaScript的原型继承详解
Feb 15 Javascript
Ajax清除浏览器js、css、图片缓存的方法
Aug 06 Javascript
javascript实现在指定元素中垂直水平居中
Sep 13 Javascript
微信小程序-获得用户输入内容
Feb 13 Javascript
angularjs封装$http为factory的方法
May 18 Javascript
浅谈webpack下的AOP式无侵入注入
Nov 12 Javascript
vue 中固定导航栏的实例代码
Nov 01 Javascript
在Vue中使用HOC模式的实现
Aug 23 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
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
详解PHP中的Traits
2015/07/29 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
js读取cookie方法总结
2014/10/31 Javascript
javascript实现table表格隔行变色的方法
2015/05/13 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
详解Python的Django框架中的中间件
2015/07/24 Python
使用Python写个小监控
2016/01/27 Python
python通过opencv实现批量剪切图片
2017/11/13 Python
基于python实现学生管理系统
2018/10/17 Python
对Django外键关系的描述
2019/07/26 Python
python使用建议与技巧分享(二)
2020/08/17 Python
简单了解python关键字global nonlocal区别
2020/09/21 Python
Perfume’s Club中文官网:西班牙美妆在线零售品牌
2020/08/24 全球购物
工商管理专业应届生求职信
2013/11/04 职场文书
质检员的岗位职责
2013/11/15 职场文书
电气工程师岗位职责
2014/01/01 职场文书
小学六年级学生评语
2014/04/22 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
公司人事专员岗位职责
2014/08/11 职场文书
远程培训的心得体会
2014/09/01 职场文书
诉讼授权委托书
2014/10/15 职场文书
店长岗位职责
2015/02/11 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
python识别围棋定位棋盘位置
2021/07/26 Python
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android