JS全局变量和局部变量

JS全局变量和局部变量全局变量和局部变量在看了一个博主写的关于js全局变量的的介绍后,自己也跟着做了一下,并且记录在这里。原博客地址:谈谈JS的全局变量跟局部变量。博主说的比较详细,也比我的表达好,如果不是没耐心,建议去看看原博主的文章先上一段代码:<scripttype=”text/javascript”>vara=1;functiontest(){ alert(a); a=4; aler

大家好,又见面了,我是你们的朋友全栈君。

全局变量和局部变量

在看了一个博主写的关于js全局变量的的介绍后,自己也跟着做了一下,并且记录在这里。
原博客地址:谈谈JS的全局变量跟局部变量
博主说的比较详细,也比我的表达好。不过我的内容多了点东西,关于定义变量时不加var的影响,在文章的最后面。

先上一段代码:
<script type="text/javascript">        
        var a =1;
        function test(){
	        alert(a); 
	        a=4;
	        alert(a); 
	        var a;    
	        alert(a); 
    	}
    	test();
    	alert(a);
</script>

在网页里输出结果为:undefined > 4 > 4 > 1

原因是:
全局变量a在外部被定义,可以在全局被使用,所以最后alert(a)显示的是1。而在方法内重新var a;相当于重新定义了一个局部变量a,会在这个方法内把全局变量的作用域掩盖,而js在执行之前的扫描检测机制会使得function内部的全局变量作用能力提前失效。这段代码就相当于:

<script type="text/javascript">        
        var a =1;
        function test(){
         	var a;     //相当于声明被提前了
	        alert(a); 
	        a=4;
	        alert(a); 
	        alert(a); 
    	}
    	test();
    	alert(a);
</script>
再看:
<script type="text/javascript">        
        var a =1;
        function test(){
	        var a = 2;
	        alert(window.a);
	        alert(a);
    	}
    	test();
    	alert(a);
</script>

输出结果为:1 > 2 > 1
和java的继承有点相似,function相当于子类,会遮盖父类信息,但是如果使用super.属性依旧会看得到父类信息,这里window就像是父类。

不一样的是: java在for,if,while内定义的变量不会在他们的范围外保留,但是:

<script type="text/javascript">        
        for(var i=0;i<2;i++){
            alert(i);
        }
        alert(i)
</script>

输出结果是:0 > 1 > 2
在for循环外部,i也被保留改动了,而i是在for循环内被定义的。while和if同样如此。

还有,在定义变量时不加var

定义变量不加var,相当于在定义全局变量

<script type="text/javascript">        
        i = 2;
        function test(){
            n = 2;
            i = 3;
            alert(n);
            alert(i);
        }
        test()
        alert(n)
        alert(i)
</script>

输出结果为:2 > 3 > 2 > 3
n在function内部被定义成全局变量,所以在外部也能被访问到
但是如果在定义n时前面加上var

<script type="text/javascript">        
        i = 2;
        function test(){
            var n = 2; //加上了var
            i = 3;
            alert(n);
            alert(i);
        }
        test()
        alert(n)
        alert(i)
</script>

结果为:2 > 3
没了!最后的alert(i)被强制中断了。在控制台可以看到出现了错误:
在这里插入图片描述
说n没有被定义,因为在内部加上了var,就相当于在当前域定义变量,而当前域是function

那么你再猜一猜下面的结果是什么?:
<script type="text/javascript">        
            i = 2;
            function test(){
                alert(i);
                i = 3;
                alert(i);
            }
            test()
           	alert(i)
</script>

输出结果为:2 > 3 > 3
因为在内部并没有重新定义i,而唯一改变的i = 3;是在检测到i在外部定义后作出的改变,所以i不会被覆盖作用域,test()里第一个alert能够看到外部i的值。

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

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

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


相关推荐

  • 怎么从安卓设备转移数据到苹果_如何将数据从安卓手机转移到苹果手机[通俗易懂]

    怎么从安卓设备转移数据到苹果_如何将数据从安卓手机转移到苹果手机[通俗易懂]手机人手一部,更新也特别快,换系统的同时也想保留之前的数据怎么办?如何将数据从安卓手机转移到苹果手机?android手机数据转移到iPhone手机的方法教程在这里为你准备,第一次使用苹果的用户怎样才能将原有android数据迁移到苹果呢?来看如下具体内容!我们都知道在大屏iPhone6和iPhone6Plus智能手机即将上市的前夕,苹果公司发布了一份详细的支持文件,指导Android用户如何…

    2022年9月18日
    2
  • SQL SERVER插件之SQLPrompt 激活使用

    SQL SERVER插件之SQLPrompt 激活使用如有不懂,可以关注麒琳技术栈,欢迎在线咨询

    2022年7月26日
    6
  • pytest parametrize fixture_参数化方法

    pytest parametrize fixture_参数化方法前言当某个接口中的一个字段,里面规定的范围为1-5,你5个数字都要单独写一条测试用例,就太麻烦了,这个时候可以使用pytest.mark.parametrize装饰器可以实现测试用例参数化。官方示

    2022年7月30日
    6
  • 5G NR协议_5G切片编排器

    5G NR协议_5G切片编排器26.1网络切片概念网络切片是一个概念,可以根据每个客户的要求进行区别对待。通过切片的形式,将不同流量差异化处理,以及可以将资源进行隔离,然后移动网络运营商可以将客户视为属于不同租户类型的客户,每种客户具有不同的服务要求,这些要求根据每个租户根据SLA(ServiceLevelAgreement,服务水平协议)可以使用哪种切片类型进行管理和订阅。网络切片始终由RAN部分和CN部…

    2022年10月2日
    2
  • 论文算法伪代码word_中文伪代码

    论文算法伪代码word_中文伪代码论文伪代码实现,Overleaf在线编辑,LaTex公式编辑

    2025年8月11日
    3
  • 平面方程_平面方程一般式的ABCD

    平面方程_平面方程一般式的ABCD参考网址:http://www.lsngo.net/2018/01/07/graphics_plane/这里将点法式展开即可得到:所以上面式子中的D=-n点乘p,n是法向量,p为坐标点,都是三维的,注意负号。这句话又是什么意思?P=<n,D>,就是四维向量。任意一点的齐次坐标为(x,y,z,1),两个点乘,得到Ax+By+Cz+D=0,其实就是P点乘Q。所以平面可以…

    2025年8月12日
    2

发表回复

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

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