Javascript:谈谈JS的全局变量跟局部变量

[javascript] view
plain
 copy

  1. <script type="text/javascript">  
  2.  var a = "Hello";  
  3.  function test(){  
  4.       var a;  
  5.       alert(a);  
  6.       a = "World";  
  7.       alert(a);  
  8.  }  
  9. </script>  

[javascript] view
plain
 copy

  1. <script type="text/javascript">  
  2.  var a = "Hello";  
  3.  function test(){  
  4.       alert(a);  
  5.       a = "World";  
  6.       alert(a);  
  7.  }  
  8. </script>  

        我想,好简单呀,不就是全局变量跟局部变量的scope问题吗?我说:"当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope。所以两段代码运行的结果分别为:1) undefined World 2) Hello World。然后我随意编了如下一个例子给她:

[javascript] view
plain
 copy

  1. <script>  
  2.    var a =1;  
  3.    function test(){  
  4.       alert(a);  
  5.       var a = 2;  
  6.       alert(a);  
  7.    }  
  8.    test();  
  9.    alert(a);  
  10. </script>  

        大家猜结果等于多少?是输出1 2 1 吗?嗯嗯,当我把测试case发给她之前也是这么认为的,但测试输出后……运行结果是 undefined 2 1。当时百思不得其解,问了谷老师才知道,我对JS还不是非常了解,所以痛下苦功,学习+测试,总结如下:

        一、Javascript的变量的scope是根据方法块来划分的(也就是说以function的一对大括号{ }来划分)。切记,是function块,而for、while、if块并不是作用域的划分标准,可以看看以下几个例子:

[javascript] view
plain
 copy

  1. <script>  
  2. function test2(){  
  3.     alert ("before for scope:"+i);    // i未赋值(并不是未声明!使用未声明的变量或函数全抛出致命错误而中断脚本执行)  
  4.   
  5.                                                     // 此时i的值是underfined  
  6.     for(var i=0;i<3;i++){  
  7.         alert("in for scope:"+i);  // i的值是 0、1、2, 当i为3时跳出循环  
  8.     }  
  9.     alert("after for scope:"+i);  // i的值是3,注意,此时已经在for scope以外,但i的值仍然保留为3  
  10.       
  11.     while(true){  
  12.         var j = 1;  
  13.         break;  
  14.     }  
  15.     alert(j);    // j的值是1,注意,此时已经在while scope以外,但j的值仍然保留为1  
  16.   
  17.     if(true){  
  18.         var k = 1;  
  19.     }  
  20.     alert(k);  //k的值是1,注意,此时已经在if scope以外,但k的值仍然保留为1  
  21. }  
  22.   
  23. test2();  
  24. //若在此时(function scope之外)再输出只存在于test2 这个function scope里的 i、j、k变量会发生神马效果呢?  
  25. alert(i); //error! 没错,是error,原因是变量i未声明(并不是未赋值,区分test2函数的第一行输出),导致脚本错误,程序到此结束!  
  26. alert("这行打印还会输出吗?"); //未执行  
  27. alert(j); //未执行  
  28. alert(k); //未执行  
  29. </script>  

        二、Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定实变量的作用域。怎么理解呢?看下面一个例子:

[javascript] view
plain
 copy

  1. <script>  
  2.     var a =1;  
  3.     function test(){  
  4.         alert(a); //a为undefined! 这个a并不是全局变量,这是因为在function scope里已经声明了(函数体倒数第4行)一个重名的局部变量,  
  5.                      //所以全局变量a被覆盖了,这说明了Javascript在执行前会对整个脚本文件的定义部分做完整分析,所以在函数test()执行前,  
  6.                      //函数体中的变量a就被指向内部的局部变量.而不是指向外部的全局变量. 但这时a只有声明,还没赋值,所以输出undefined。  
  7.         a=4         
  8.         alert(a);  //a为4,没悬念了吧? 这里的a还是局部变量哦!  
  9.         var a;     //局部变量a在这行声明  
  10.         alert(a);  //a还是为4,这是因为之前已把4赋给a了  
  11.     }  
  12.     test();  
  13.     alert(a); //a为1,这里并不在function scope内,a的值为全局变量的值  
  14. </script>  

        三,当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope,而当全局变量遇上局部变量时,怎样使用全局变量呢?用window.globalVariableName。

[javascript] view
plain
 copy

  1. <script>  
  2.     var a =1;  
  3.     function test(){     
  4.         alert(window.a);  //a为1,这里的a是全局变量哦!  
  5.         var a=2;     //局部变量a在这行定义  
  6.         alert(a);  //a为2,这里的a是局部变量哦!  
  7.     }  
  8.     test();  
  9.     alert(a); //a为1,这里并不在function scope内,a的值为全局变量的值  
  10. </script>  
时间: 2024-09-20 11:00:42

Javascript:谈谈JS的全局变量跟局部变量的相关文章

Javascript学习之谈谈JS的全局变量跟局部变量(推荐)_javascript技巧

今天公司一个实习小妹子问我两段JS代码的区别: 代码一: <script type="text/javascript"> var a = "Hello"; function test(){ var a; alert(a); a = "World"; alert(a); } </script> 代码二: <script type="text/javascript"> var a = "

浅谈JavaScript的全局变量与局部变量_javascript技巧

一.JavaScript scope 的划分标准是function函数块,不是以 if.while.for来划分的 <script> function f1(){ alert("before for scope:"+i); //i未赋值(并不是没有声明!使用未声明变量或函数会导致致命错误从而中断脚本执行) //此时i值为undefined for(var i=0; i<3;i++){ alert("in for scope:"+i);} //i的值

JS全局变量和局部变量最新解析_javascript技巧

就是这种盲目无原理依据的研究测试弄晕了我, 有必要这么做吗? 其实理解了原理就没必要搞这么多一个一个的试, 然后得出规律, ECMAScript规则都已经定义好了. var的规则是: 使用var声明变量就是内部变量, 否则就是先调用全局变量, 不管多少层函数. this的规则是: method函数里的this永远指向自身, 普通函数的this永远指向DOMWindow. // GodDamnTest1 function Foo() { var a = 123; // 局部变量, 所有子函数的全局

js中全局变量为什么是不能删除?

问题描述 js中全局变量为什么是不能删除? 请问下各位大牛,为什么说js中用var申明的全局变量是永久的,即不能(delete)删除,该变量的回收是在程序执行完之后吗? 解决方案 通过var声明的变量无法被delete由于作用域.GC机制,实在担心你就赋个null好了http://blog.csdn.net/lax441400/article/details/4913241 解决方案二: 貌似的确不能删除,不过可以赋值为undefined

计算机-js如何动态改变局部变量

问题描述 js如何动态改变局部变量 这是我的代码: if(listData.length>0){ debugger; var count = 1; var serviceInfoY={}; for(var m=0;m<listData.length;m++){ if(m==0){ serviceInfoY.data = listData[m].USE_CPU; var PID = listData[m].PID; var PID_1 = PID[0]; serviceInfoY.type =

jsp全局变量与局部变量在JSP页面刷新后的变化?

问题描述 jsp全局变量与局部变量在JSP页面刷新后的变化? 解决方案 局部变量在对应区块以局部变量为准,否则以全局变量为准. 解决方案二: 全局变量和局部变量同时可见且命名相同,操作时以局部变量为准. 否则,以全局变量为准 解决方案三: 局部变量能访问到的以局部变量为准,否则以全局变量为准. 解决方案四: 这个说的是变量的生存周期.一个页面内定义的变量,属于这个页面对象.而每次独立的请求,jsp都会产生一个新的页面对象,彼此无涉.所以不会相互影响. 解决方案五: 页面刷新局部变量和全局变量都回

android ndk-NDK .cpp中全局变量与局部变量

问题描述 NDK .cpp中全局变量与局部变量 如题,Android NDK开发中,在.cpp中同样的程序将其中定义的局部变量换为全局变量之后,程序的运行时延增加好多(增加了一半),原因是什么啊? 在C中的全局变量被NDK的gcc编译器放到ARM平台的哪块区域了? 解决方案 全局变量和局部变量全局变量和局部变量全局变量和局部变量 解决方案二: 这两者应该不会导致这么大的悬殊,你可以先跟踪一下,看你的延时具体是什么引起的,是不是有逻辑问题

简单谈谈JS数组中的indexOf方法_javascript技巧

前言 相信说到 indexOf 大家并不陌生,判断字符串是否包涵子字符串时特别常用,正则不熟练同学的利器.这篇文章就最近遇到的一个问题,用实例再说说说indexOf方法.本文是小知识点积累,不作为深入讨论的话题,因此这里没有解释indexOf()的第二个参数,相信大家都知道第二个参数的作用. String 类型的使用 温习一下大家熟知的字符串用法,举个 let str = 'orange'; str.indexOf('o'); //0 str.indexOf('n'); //3 str.inde

c语言全局变量和局部变量问题及解决汇总_C 语言

1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量.对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内. 2.如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全