今天公司一个实习小妹子问我两段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 = "Hello";  
-  function test(){  
-       alert(a);  
-       a = "World";  
-       alert(a);  
-  }  
- </script>  
 
        
我想,好简单呀,不就是全局变量跟局部变量的scope问题吗?我说:"当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的
scope,当离开局部变量的scope后,又重回到全局变量的scope。所以两段代码运行的结果分别为:1) undefined World 2)
 Hello World。然后我随意编了如下一个例子给她:
- <script>  
-    var a =1;  
-    function test(){  
-       alert(a);  
-       var a = 2;  
-       alert(a);  
-    }  
-    test();  
-    alert(a);  
- </script>  
 
 
       大家猜结果等于多少?是输出1 2 1 吗?嗯嗯,当我把测试case发给她之前也是这么认为的,但测试输出后……运行结果是 
undefined 2 1。当时百思不得其解,问了谷老师才知道,我对JS还不是非常了解,所以痛下苦功,学习+测试,总结如下:
        一、Javascript的变量的scope是根据方法块来划分的(也就是说以function的一对大括号{ }来划分)。切记,是function块,而for、while、if块并不是作用域的划分标准,可以看看以下几个例子:
 
- <script>  
- function test2(){  
-     alert ("before for scope:"+i);    
-   
-                                                     
-     for(var i=0;i<3;i++){  
-         alert("in for scope:"+i);  
-     }  
-     alert("after for scope:"+i);  
-       
-     while(true){  
-         var j = 1;  
-         break;  
-     }  
-     alert(j);    
-   
-     if(true){  
-         var k = 1;  
-     }  
-     alert(k);  
- }  
-   
- test2();  
- alert(i); 
- alert("这行打印还会输出吗?"); 
- alert(j); 
- alert(k); 
- </script>  
 
        二、Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定实变量的作用域。怎么理解呢?看下面一个例子:
- <script>  
-     var a =1;  
-     function test(){  
-         alert(a); 
-                      
-                      
-         a=4         
-         alert(a);  
-         var a;     
-         alert(a);  
-     }  
-     test();  
-     alert(a); 
- </script>  
 
 
       
三,当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope,而
当全局变量遇上局部变量时,怎样使用全局变量呢?用window.globalVariableName。
- <script>  
-     var a =1;  
-     function test(){     
-         alert(window.a);  
-         var a=2;     
-         alert(a);  
-     }  
-     test();  
-     alert(a); 
- </script>  
 
        (转自:
http://apps.hi.baidu.com/share/detail/50528730)