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 相关文章推荐
javascript在myeclipse中报错的解决方法
Oct 29 Javascript
选择复选框按钮置灰否则按钮可用
May 22 Javascript
JS中完美兼容各大浏览器的scrolltop方法
Apr 17 Javascript
浅谈JavaScript中运算符的优先级
Jul 07 Javascript
简介AngularJS中$http服务的用法
Feb 06 Javascript
EasyUI Combobox设置默认值 获取text的方法
Nov 28 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
Dec 13 Javascript
原生js实现放大镜特效
Mar 08 Javascript
详解vue-router 2.0 常用基础知识点之router-link
May 10 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
Jun 07 Javascript
微信浏览器左上角返回按钮监听的实现
Mar 04 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
May 31 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开启openssl的方法
2014/05/15 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
javascript 常用方法总结
2009/06/03 Javascript
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
JavaScript获取网页支持表单字符集的方法
2015/04/02 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
Node.js中防止错误导致的进程阻塞的方法
2016/08/11 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
NodeJs使用Mysql模块实现事务处理实例
2017/05/31 NodeJs
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
Python文件循环写入行时防止覆盖的解决方法
2018/11/09 Python
详解python中sort排序使用
2019/03/23 Python
Python第三方库face_recognition在windows上的安装过程
2019/05/03 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
Python使用Chrome插件实现爬虫过程图解
2020/06/09 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
开会迟到检讨书
2014/02/03 职场文书
公司捐款倡议书
2014/05/14 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
先进教师个人总结
2015/02/11 职场文书
出生证明格式
2015/06/15 职场文书
nginx前后端同域名配置的方法实现
2021/03/31 Servers
如何用PHP实现多线程编程
2021/05/26 PHP
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis