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背投广告代码的完善
Apr 08 Javascript
js特殊字符过滤的示例代码
Mar 05 Javascript
js清空form表单中的内容示例
May 20 Javascript
js实现点击添加一个input节点
Dec 05 Javascript
JavaScript DOM 学习总结(五)
Nov 24 Javascript
js实现数组冒泡排序、快速排序原理
Mar 08 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
Aug 02 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
Mar 15 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
Jun 23 Javascript
对于js垃圾回收机制的理解
Sep 14 Javascript
JavaScript enum枚举类型定义及使用方法
May 15 Javascript
详解js创建对象的几种方式和对象方法
Mar 01 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 xml留言板 xml存储数据的简单例子
2009/08/24 PHP
解析PHP中empty is_null和isset的测试
2013/06/29 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
php实现自定义中奖项数和概率的抽奖函数示例
2017/05/26 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
javascript动画效果类封装代码
2007/08/28 Javascript
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
JavaScript结合HTML DOM实现联动菜单
2017/04/05 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
Python  unittest单元测试框架的使用
2018/09/08 Python
对python 操作solr索引数据的实例详解
2018/12/07 Python
python dict 相同key 合并value的实例
2019/01/21 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
世界知名接发和假发品牌:Poze Hair
2017/03/08 全球购物
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
热爱祖国演讲稿
2014/05/04 职场文书
服务口号大全
2014/06/11 职场文书
地方白酒代理协议书
2014/10/25 职场文书
北京故宫导游词
2015/01/31 职场文书
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android