深入解析JavaScript中的变量作用域


Posted in Javascript onDecember 06, 2013

在学习JavaScript的变量作用域之前,我们应当明确几点:

•JavaScript的变量作用域是基于其特有的作用域链的。

•JavaScript没有块级作用域。

•函数中声明的变量在整个函数中都有定义。

1、JavaScript的作用域链
首先看下下面这段代码:

<script type="text/javascript"> var rain = 1; function rainman(){ var man = 2; function inner(){ var innerVar = 4; alert(rain); } inner(); //调用inner函数 } rainman(); //调用rainman函数</script>

观察alert(rain);这句代码。JavaScript首先在inner函数中查找是否定义了变量rain,如果定义了则使用inner函数中的rain变量;如果inner函数中没有定义rain变量,JavaScript则会继续在rainman函数中查找是否定义了rain变量,在这段代码中rainman函数体内没有定义rain变量,则JavaScript引擎会继续向上(全局对象)查找是否定义了rain;在全局对象中我们定义了rain = 1,因此最终结果会弹出'1'。

作用域链:JavaScript需要查询一个变量x时,首先会查找作用域链的第一个对象,如果以第一个对象没有定义x变量,JavaScript会继续查找有没有定义x变量,如果第二个对象没有定义则会继续查找,以此类推。

上面的代码涉及到了三个作用域链对象,依次是:inner、rainman、window。

2、函数体内部,局部变量的优先级比同名的全局变量高。

<script type="text/javascript"> var rain = 1; //定义全局变量 rain function check(){ var rain = 100; //定义局部变量rain alert( rain ); //这里会弹出 100 } check(); alert( rain ); //这里会弹出1</script>

3、JavaScript没有块级作用域。

这一点也是JavaScript相比其它语言较灵活的部分。

仔细观察下面的代码,你会发现变量i、j、k作用域是相同的,他们在整个rain函数体内都是全局的。

<script type="text/javascript"> function rainman(){ // rainman函数体内存在三个局部变量 i j k var i = 0; if ( 1 ) { var j = 0; for(var k = 0; k < 3; k++) { alert( k ); //分别弹出 0 1 2 } alert( k ); //弹出3 } alert( j ); //弹出0 }</script>

4、函数中声明的变量在整个函数中都有定义。

首先观察这段代码:

<script type="text/javascript"> function rain(){ var x = 1; function man(){ x = 100; } man(); //调用man alert( x ); //这里会弹出 100 } rain(); //调用rain</script>

上面得代码说明了,变量x在整个rain函数体内都可以使用,并可以重新赋值。由于这条规则,会产生“匪夷所思”的结果,观察下面的代码。
<script type="text/javascript"> var x = 1; function rain(){ alert( x ); //弹出 'undefined',而不是1 var x = 'rain-man'; alert( x ); //弹出 'rain-man' } rain();</script>

是由于在函数rain内局部变量x在整个函数体内都有定义( var x= 'rain-man',进行了声明),所以在整个rain函数体内隐藏了同名的全局变量x。这里之所以会弹出'undefined'是因为,第一个执行alert(x)时,局部变量x仍未被初始化。

所以上面的rain函数等同于下面的函数:

function rain(){ var x; alert( x ); x = 'rain-man'; alert( x );}

5、未使用var关键字定义的变量都是全局变量。
<script type="text/javascript"> function rain(){ x = 100; //声明了全局变量x并进行赋值 } rain(); alert( x ); //会弹出100 </script>

这也是JavaScript新手常见的错误,无意之中留下的许多全局变量。

6、全局变量都是window对象的属性

<script type="text/javascript"> var x = 100 ; alert( window.x );//弹出100 alert(x);</script>

等同于下面的代码
<script type="text/javascript"> window.x = 100; alert( window.x ); alert(x)</script>
Javascript 相关文章推荐
教您去掉ie网页加载进度条的方法
Dec 09 Javascript
jQuery中校验时间格式的正则表达式小结
Sep 22 Javascript
原生javascript实现隔行换色
Jan 04 Javascript
js+CSS实现弹出居中背景半透明div层的方法
Feb 26 Javascript
jQuery操作基本控件方法实例分析
Dec 31 Javascript
javascript创建cookie、读取cookie
Mar 31 Javascript
基于javascript数组实现图片轮播
May 02 Javascript
基于JavaScript实现全选、不选和反选效果
Feb 15 Javascript
javascript cookie的基本操作(添加和删除)
Jul 24 Javascript
JavaScript控制浏览器全屏显示简单示例
Jul 05 Javascript
微信小程序之高德地图多点路线规划过程示例详解
Jan 18 Javascript
Echarts如何重新渲染实例详解
May 30 Javascript
关于Javascript作用域链的八点总结
Dec 06 #Javascript
Javascript变量作用域详解
Dec 06 #Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
Dec 06 #Javascript
Javascript中克隆一个数组的实现代码
Dec 06 #Javascript
浅析JavaScript中的同名标识符优先级
Dec 06 #Javascript
如何判断元素是否为HTMLElement元素
Dec 06 #Javascript
随鼠标上下滚动的jquery代码
Dec 05 #Javascript
You might like
数据库查询记录php 多行多列显示
2009/08/15 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
PHP微信PC二维码登陆的实现思路
2017/07/13 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
JS模板实现方法
2013/04/03 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
深入理解vue路由的使用
2017/03/24 Javascript
详解ES6中class的实现原理
2020/10/03 Javascript
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
Python学习入门之区块链详解
2017/07/25 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
关于Python作用域自学总结
2019/06/10 Python
python调用私有属性的方法总结
2020/07/24 Python
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
西部世纪.net笔试题面试题
2014/04/03 面试题
个人应聘自我评价分享
2013/11/18 职场文书
租房协议书怎么写
2014/04/10 职场文书
单位承诺书格式
2014/05/21 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
公安四风对照检查材料思想汇报
2014/10/11 职场文书
党的群众路线教育实践活动个人整改措施材料
2014/11/04 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
开学典礼校长致辞
2015/07/29 职场文书
纯CSS实现酷炫的霓虹灯效果
2021/04/13 HTML / CSS