javascript变量:全局?还是局部?这个得注意

在JS中,是没有块级作用域的

      举两个个例子:

      if语句块:    

if (true){
	var name='Ling';
}
alert(name);

输出:Ling

      for语句块;

for(var i=0;i<10;i++) {
	var name='Ling';
}
alert(i);
alert(name);

输出:10

输出:Ling

也就是说最后的结果都是window下全局变量:

<span style="font-family:KaiTi_GB2312;">alert(window.i);
alert(window.name);</span>

在Javascript的函数体中,有下面几种情况需要注意:

      1、有无Var

        如果有Var,在函数内部声明变量是局部变量,如下例,读取不到name的数据。

<span style="font-family:KaiTi_GB2312;">function box(){
	var name ='Ling';
}
alert(name);</span>

        如果把var去掉的话,那么就会输出:Ling,此时声明的变量为全局变量。在写代码的过程中,不适用var就初始变量的话,会有很多意外发生,所以初始变量的时候一定要加上var。

       2、全局变量和局部变量命名相同    

<span style="font-family:KaiTi_GB2312;">var scope="global";  
function t(){  
    alert(scope);  
    var scope="local"  
    alert(scope);  
} </span>

    最终的输出结果是:

               undefined

               local

   为什么会出现这样的结果?因为:

   javascript 变量范围 (1)全局变量的作用域是全局性的,即在整个Javascript程序中,全局变量作用处处都存在。定义在”script”块中,在”function”函数外。 (2)局部变量的作用域是局部性的,在函数内部或函数参数时定义,作用范围是从函数开始到结尾(注意此处说法) (3)在函数内部,局部变量的优先级比同名的全局变量优先级要高;如果存在与全局变量名称相同的局部变量(包括参数),那么该全局变量将不再起作用。

  原来是这个原因。不知道你看明白了没有~~

  那么当全局变量和局部变量重名时,怎么解决这个问题呢?

  哈哈~~最简单的当然就是避免全局变量和局部变量相遇咯~~

  还有另外一种方法,window对象的所有属性拥有全局作用域,用window.全局变量名,如下:

<span style="font-family:KaiTi_GB2312;">var scope="global";  
function t(){  
    alert(window.scope);  
    var scope="local"  
    alert(scope);  
}  </span>

至此,问题也就说完了。

总结

上面的问题其实也反映的另一个问题,命名规范的问题,如果命名不规范,就会出现很多意想不到的问题,所以,花点时间上网查查几种不同的命名的规范,这样能在你编写代码的时候减少不必要的麻烦。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

享学课堂谈-Python程序员的常见错误

这些是Python初学者活生生犯的错,千百次的错。事实上,这些错误实在是太普遍了以至于我敢保证你刚开始学的时候是一定会犯的。 “那么是什么呢?”你会问,“你也会...

22090
来自专栏deepcc

用 Function.apply() 的参数数组化来提高 JavaScript程序性能

34750
来自专栏自动化测试实战

RF自定义系统关键字

42870
来自专栏lgp20151222

@Transient 理解

transient使用小结 1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。 2)transient...

12810
来自专栏C语言C++游戏编程

七夕来了,请用C 语言和我交流

当我们提到输入时,这意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。C 语言提供了一系列内置的函数来读取给定的输入,并根据需要填充到程序中。

14120
来自专栏Python小白进阶之旅

Python数据类型:双端队列deque-比列表list性能更高的一种数据类型

说到容器类型,大家第一时间想到的多半是list,而list确实也能解决大部分的需要,但碰到列表内的数据量相当大的时候,性能问题就显得尤为重要;再或者列表被恶意注...

16730
来自专栏IT派

Python字节码介绍

如果你曾经编写亦或只是使用Python语言,那么你可能已经习惯了看Python源码文件; 源码的文件名以.py结尾。或许你也已经注意到了另一种类型的文件,文件名...

26730
来自专栏玄魂工作室

看代码学安全(11) - unserialize反序列化漏洞

大家好,我们是红日安全-代码审计小组。最近我们小组正在做一个PHP代码审计的项目,供大家学习交流,我们给这个项目起了一个名字叫 PHP-Audit-Labs 。...

17730
来自专栏大闲人柴毛毛

Java异常体系中的秘密

相信大家每天都在使用Java异常机制,也相信大家对try-catch-finally执行流程烂熟于胸。本文将介绍Java异常机制的一些细节问题,这些问题虽然很...

404100
来自专栏程序员互动联盟

【专业技术】C++ RTTI及“反射”技术

RTTI   RTTI(Run-Time Type Information)运行时类型检查的英文缩写,它提供了运行时确定对象类型的方法。面向对象的编程语言,象C...

37250

扫码关注云+社区

领取腾讯云代金券