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 相关文章推荐
国外大牛IE版本检测!现在IE都到9了,IE检测代码
Jan 04 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
Aug 02 Javascript
jQuery DOM插入节点操作指南
Mar 03 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
Sep 04 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
Dec 13 Javascript
Bootstrap实现下拉菜单效果
Apr 29 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
Sep 05 Javascript
JS之获取样式的简单实现方法(推荐)
Sep 13 Javascript
JavaScript实现页面无操作倒计时退出
Oct 22 Javascript
Asp.Net之JS生成分页条的方法
Nov 23 Javascript
vue-resource拦截器设置头信息的实例
Oct 27 Javascript
vue中动态绑定表单元素的属性方法
Feb 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中取得image按钮传递的name值
2006/10/09 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
javascript JSON操作入门实例
2010/04/16 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
在angularJs中进行数据遍历的2种方法
2018/10/08 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
Layui给switch添加响应事件的例子
2019/09/03 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
JS实现图片切换特效
2019/12/23 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
Python functools模块学习总结
2015/05/09 Python
Python的Django框架安装全攻略
2015/07/15 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
Django的Modelforms用法简介
2019/07/27 Python
Python 3 判断2个字典相同
2019/08/06 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
如何使用python写截屏小工具
2020/09/29 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
文秘专业大学生求职信
2013/11/10 职场文书
金融行业职业生涯规划范文
2014/01/17 职场文书
python中数组和列表的简单实例
2022/03/25 Python