JavaScript的变量作用域深入理解(转)

JavaScript的变量作用域深入理解(转)

在学习JavaScript的变量作用域之前,我们应当明确几点: 
a、JavaScript的变量作用域是基于其特有的作用域链的。 
b、JavaScript没有块级作用域。 
c、函数中声明的变量在整个函数中都有定义。 

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

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

  上面得代码说明了,变量x在整个rain函数体内都可以使用,并可以重新赋值。由于这条规则,会产生“匪夷所思”的结果,观察下面的代码。 

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

代码如下:

<script type="text/javascript" language="javascript"> 
var x = 1; 
function rain(){ 
alert( x ); //弹出 'undefined',而不是1 
var x = 'rain-man'; 
alert( x ); //弹出 'rain-man' 
} 
rain() 
</script>

 

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

代码如下:
function rain(){ 
var x; 
alert( x ); 
x = 'rain-man'; 
alert( x ); 
} 

5、未使用var关键字定义的变量都是全局变量。 

代码如下:

<script type="text/javascript" language="javascript"> 
function rain(){ 
x = 100; //声明了全局变量x并进行赋值 
} 
rain(); 
alert( x ); //会弹出100 
</script> 

这也是JavaScript新手常见的错误,无意之中留下的许多全局变量。 
6、全局变量都是window对象的属性 

代码如下:
<script type="text/javascript" language="javascript"> 
var x = 100 ; 
alert( window.x );//弹出100 
alert(x); 
</script> 

等同于下面的代码 

代码如下:
<script type="text/javascript" language="javascript"> 
window.x = 100; 
alert( window.x ); 
alert(x) 
</script> 

转载于:https://www.cnblogs.com/timerainbow/p/4446484.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109479.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java单例模式的5种实现方法

    Java单例模式的5种实现方法单例模式有5种实现方式:饿汉、懒汉、双重校验锁、静态内部类和枚举饿汉类加载的时候就创建了实例优点:类加载的时候创建一次实例,避免了多线程同步问题缺点:即使单例没被用到也会创建,浪费内存publicclassSingleton{privatestaticSingletoninstance=newSingleton();privateSing…

    2022年7月8日
    22
  • 开源代码网站

    开源代码网站!!!github!!!codepen!!!码云(1)到sourceforge上查找相关代码;(2)到google code上面查找具体的代码;(3)到apache网站上寻找java的相关代码;(4)直接到开源项目网站上面寻找代码;(5)到csdn等网站下载代码,偶尔会有意外的收获;(6)到图书出版社下载图书附录的代码;

    2022年7月15日
    15
  • photoshop是目前图像处理理最顶级的一款软件_图片处理软件app

    photoshop是目前图像处理理最顶级的一款软件_图片处理软件app说到照片和图像编辑/操纵,真的没有更好的应用,AdobePS图象处理软件。 摄影师和创意工作室会同意这是总理的照片编辑应用期。不幸的是,PS图象处理软件还配备了一个陡峭的学习曲线和价格标签,我们必须考虑我们不会使用矫枉过正的1/3的功能包装成PS图象处理软件。 记住让我们看一些免费的在线和客户端安装的应用程序可以在互联网上看。 选项是巨大的所以我缩小了我的审查,只有最好的在线和客户端安装

    2022年4月20日
    60
  • Python之高级库socketserver

    socket并不能多并发,只能支持一个用户,socketserver简化了编写网络服务程序的任务,socketserver是socket的在封装。socketserver在python2中为Sock

    2021年12月18日
    46
  • 安装yum(Ubuntu中的安装,带讲解,以及源的更新)

    安装yum(Ubuntu中的安装,带讲解,以及源的更新)Ubuntu 中 yum 的安装 带讲解 先放上我这只菜鸟的绝望 在网上找了好久都搞不定 那些文章都不带人思考 一路给一堆命令 然而都搞不定 白瞎了 或者说我实在太菜 冷静 calmdown 重要的一步 我们来分析一下 这边说的是在软件包里面无法定位 yum 问题是什么 怎么解决直接的问题呢 right 直接的解决方法就是去更新软件包 而那种去找各种代码来安装 yum 的 只要源一修改 什么软件没

    2025年6月23日
    4
  • Unity 3D完全自学教程_十二小时等于多少日

    Unity 3D完全自学教程_十二小时等于多少日unity入门教学,新手教学,新手到大神的教学。。。

    2022年8月10日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号