深入解析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 相关文章推荐
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
Mar 10 Javascript
Prototype PeriodicalExecuter对象 学习
Jul 19 Javascript
轻轻松松学JS调试(不下载任何工具)
Apr 14 Javascript
jQuery实现的类flash菜单效果代码
May 17 Javascript
javascript生成随机数的方法
May 16 Javascript
jQuery()方法的第二个参数详解
Apr 29 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
Jun 12 Javascript
javaScript语法总结
Nov 25 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
Aug 16 Javascript
vue router 源码概览案例分析
Oct 09 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
Sep 09 Javascript
实现一个Vue自定义指令懒加载的方法示例
Jun 04 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
DOTA2 探索永无止境 玩家自创强悍插眼攻略
2020/04/20 DOTA
PHP和XSS跨站攻击的防范
2007/04/17 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
php绘制一条弧线的方法
2015/01/24 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
关于跨站脚本攻击问题
2011/12/22 Javascript
函数式 JavaScript(一)简介
2014/07/07 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
Python实现pdf文档转txt的方法示例
2018/01/19 Python
python 日期操作类代码
2018/05/05 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
Viking比利时:购买办公用品
2019/10/30 全球购物
终端业务员岗位职责
2013/11/27 职场文书
党员学习十八大感想
2014/01/17 职场文书
小加工厂管理制度
2014/01/21 职场文书
蛋糕店的商业计划书范文
2014/01/27 职场文书
《藏戏》教学反思
2014/02/11 职场文书
数控技术学生的自我评价
2014/02/15 职场文书
买卖协议书范本
2014/04/21 职场文书
平安家庭事迹材料
2014/12/20 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
2016年寒假见闻
2015/10/10 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python
Oracle中日期的使用方法实例
2022/07/07 Oracle