JavaScript作用域

  學習JavaScript中,作用域算是比較重要的一塊,因爲比較抽象,所以很多人都難免模模糊糊,包括我自己也是這樣
  所以我自己寫下了自己的理解,如果有什麼不對的,請指出謝謝..
js解析順序和作用域 js的解析順序是按照作用域來讀取代碼
  那麼什麼是作用域呢,JavaScript本身就是一個最大的作用域, 
  每一個函數執行的時候都會產生一個作用域.  
 很多人認爲js的解析順序是從上到下的,這是錯誤的 
  舉個例子:   var a =10;  
               alert(a);  
            代碼會彈出10,   
            alert(a);  
            var a=10; 
          這時候會彈出一個undefined,而不是報錯,說明什麼,說明裏面已經有一個變量a,但是沒有賦值 
 每一個域裏面代碼的解析順序:  
     1.定義:   找var (只會找出變量名,但是並不會執行後面的賦值)
               找function; 
     2.執行:   從上往下執行代碼;
  
 我們在來看看作用域  
 我們來看一個例子  
 <script>   
      var a=10;//全局變量 
  </script>
   <script>  
    alert(a)
      </script>  
 結果卻顯示可以彈出結果,按理說兩個域之間是不可以相互跨越的 . 
  但 var a相當於window.a ,也就是全局變量, 
相當於定義在window對象下.  
 那麼我們在舉個例子 , 
           var a=0;  
          function mun(){    var b=50;   }  
          這個是全局變量麼 ,答案肯定不是 ,上面已經說到每個函數都有一個自己的域,
          而這個b 的作用域就是這個函數
          而a是在script聲明的,所以他是全局變量.. 
         作用域鏈 :   
          舉一個例子:  
          var a=10; 
           Fn();  
          a=20; 
          function Fn()
        {   var b=20;   alert(a);   alert(b);
          }  
        執行順序   
          1: 定義: 找變量 var a       
                       找函數體 function Fn(){   
                         var b=20;     
                         alert(a);     
                        alert(b);   
                          } 
           2:執行:     
                 a=10;  
                Fn()==>執行函數,進入Fn()作用域   ====>1:定義 var b                                   
                                                                               2: 執行:                       
                                                                                 b=20;                        
                                                                               alert(a);  //最終彈出10               
                                                                               alert(b)   //最終彈出20 
           在來看一個例子:  
          var a=10; 
          var b=15;  
          Fn();  
          a=20; 
          function Fn(){    
           var a=5; 
           b=20;  
          alert(a);   
           alert(b); 
             }   
              alert(a);   
             alert(b);     
            解析順序:     
                         1. 找變量  var a;          
                                        var b;      
                             找函數體 function Fn(){                  
                                    var a=5;          
                                      b=20;        
                                     alert(a);         
                                     alert(b)         
                                                              }      
                             2.執行 a=10;        
                                     b=15;        
                                     Fn(); ====> 1.var a              
                                                         2. a=5;                 
                                                           b=20;                
                                                         alert(a)//5          
                                                       alert(b)//20        =====>返回父級作用域 (script)    
                                                                                               a=20;   
                                                                                              alert(a); //20  
                                                                                               alert(b) //20  
                                                 注意:函數裏面的 b=20;
                                 沒有var 所以他是全局變量window.b    
                              所以在全局的b=15 被重新賦值爲20; 
                                下面的幾個例子我就不寫順序了 ...  
                        var x=5;    
                           a();   
                       function a(){      
                        alert(x);  //undefined;     var x=10; 
                                         }  
                         alert(x); //5
發佈了26 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章