深入解析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 相关文章推荐
jquery ajax 登录验证实现代码
Sep 23 Javascript
JS俄罗斯方块,包含完整的设计理念
Dec 11 Javascript
javascript 45种缓动效果 非常酷
Jun 28 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
May 23 Javascript
使用node.js 制作网站前台后台
Nov 13 Javascript
Javascript基础教程之数据类型 (字符串 String)
Jan 18 Javascript
JavaScript分秒倒计时器实现方法
Feb 02 Javascript
javascript实现全角半角检测的方法
Jul 23 Javascript
JS运动特效之同时运动实现方法分析
Jan 24 Javascript
Vue中render方法的使用详解
Jan 26 Javascript
Vue动态控制input的disabled属性的方法
Jun 26 Javascript
基于JavaScript实现猜数字游戏代码实例
Jul 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中文汉字验证码
2007/04/08 PHP
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
语义化 H1 标签
2008/01/14 Javascript
显示js对象所有属性和方法的函数
2009/10/16 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
2013/07/01 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
vue.extend与vue.component的区别和联系
2018/09/19 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
原生JavaScript实现留言板
2021/01/10 Javascript
Python socket编程实例详解
2015/05/27 Python
Python实现高效求解素数代码实例
2015/06/30 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
2016/03/14 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
python列表的逆序遍历实现
2020/04/20 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
英国DVD和蓝光碟片购买网站:Zoom.co.uk(电影和电视)
2019/09/23 全球购物
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
服务员岗位责任制
2014/02/11 职场文书
行政专员求职信范文
2014/05/03 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
历史学专业求职信
2014/06/19 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
2014年教师学期工作总结
2014/11/08 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
2014年实验室工作总结
2014/12/03 职场文书
Java 关于String字符串原理上的问题
2022/04/07 Java/Android