<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    零全零美(www.zzgwt.com)
    生活中的很多事情,并不像If...Else那么簡單!
    posts - 96,comments - 52,trackbacks - 0
        變量的生命周期又稱為作用域,是指某變量在程序中的有效范圍。根據作用域,變量可以分為全局變量和局部變量。
        1、  全局變量的作用域是全局性的,即在整個JavaScript程序中,全局變量處處都在。
        2、  而在函數內部聲明的變量,只在函數內部起作用。這些變量是局部變量,作用域是局部性的;函數的參數也是局部性的,只在函數內部起作用。
        經常見到網上有文章說:“在JavaScript中可以有兩種方式聲明全局變量:1、聲明變量時不使用var關鍵字 2、在函數外部聲明變量 使用第一種方法聲明變量時,就算是在函數內部,該變量仍為全局變量,使用第二種方法聲明變量時,就算是用var關鍵字,那么聲明的變量也是全局變量,” 自己親手測試一下就知其中對錯:參看如下示例:

     1     <script type="text/javascript">
     2         var v01 = "我是全局變量v01"//使用var關鍵字聲明的全局變量
     3             v02 = "我是全局變量v02"//未使用var關鍵字聲明的全局變量
     4         function fun1(){
     5             alert(v01); //output "我是全局變量v01"
     6             alert(v02); //output "我是全局變量v02"
     7             
     8                 v03 = "我是全局變量v03";
     9             var v04 = "我是局部變量v04";
    10         }
    11         
    12         function fun2(){
    13             alert(v01); //output "我是全局變量v01"
    14             alert(v02); //output "我是全局變量v02"
    15              
    16             alert(v03); //error: "v03未定義" 
    17             alert(v04); //error:  "v04未定義"
    18             
    19         }
    20         
    21         fun2();
    22     </script>

      為什么結果與大家公認的不一致呢,讓我們把程序做稍微的改動:
     
     1     <script type="text/javascript">
     2         var v01 = "我是全局變量v01"//使用var關鍵字聲明的全局變量
     3             v02 = "我是全局變量v02"//未使用var關鍵字聲明的全局變量
     4         function fun1(){
     5             alert(v01); //output "我是全局變量v01"
     6             alert(v02); //output "我是全局變量v02"
     7             
     8                 v03 = "我是全局變量v03";
     9             var v04 = "我是局部變量v04";
    10         }
    11         
    12         function fun2(){
    13             alert(v01); //output "我是全局變量v01"
    14             alert(v02); //output "我是全局變量v02"
    15              
    16             alert(v03); //output: "我是全局變量v03" 
    17             alert(v04); //error:  "v04未定義"
    18             
    19         }
    20         //兩個函數都調用
    21         fun1();
    22         fun2();
    23     </script>

    呵呵,這個時候,程序終于按照我們原先的設想執行了,但是這個時候,我們就必須做下來好好總結一下了:
    如果我們在函數內部聲明了一個全局變量,也就是聲明變量時未使用var關鍵字,當我們在其他地方使用該變量時,必須保證該函數已被調用,所以,如果真的要使用全局變量還是在函數外部聲明的好

    還有一個值得注意的地方就是:JavaScript變量作用范圍沒有語句塊的概念,他并不像JAVA一樣在for循環內部聲明的變量,在for循環外部就不能使用,參看一下示例:
     1         function test(){
     2             for(var i =0 ; i <20; i++){
     3                 document.write(i+"<BR>");
     4                 if(i == 19) {
     5                     var j = "我是在for語句內部聲明的";
     6                 }
     7             }
     8             alert(j); //output: "我是在for語句內部聲明的"
     9         }
    10         test();

      除此之外,還有一個容易引起錯誤的地方不能不說,參看一下程序:
    1         var strTest = "全局變量";
    2         function test1(){
    3             alert(strTest);  //output: "undefined"
    4             var strTest = "看看出錯沒";
    5         }
    6         test1();
      先來解釋一下這個小程序,我們首先在函數外部聲明了一個全局性的變量,接著在函數內部把它alert出來,最后我們又聲明了一個同全局變量的名字相同的一個局部變量,但是就是這個只有六行的小程序,其結果卻并不像我們想象的那樣輸出"看看出錯沒",而是輸出了undefined,呵呵,看來“JavaScript真是處處是陷阱啊”!
      在網上GOOGLE了半天,找到了這樣一種說法:
       大家都知道JavaScript是一種解釋型的腳本語言,當JavaScript運行時,首先查找所有的變量聲明,并以未定義的初始值創建變量。如果變量被聲明時有值,那么該變量仍以未定義的值初始化,并且只有在運行了聲明行時才被聲明值取代。
      這也就解釋了以上的程序,其實如果我們在程序的第一行之前加上一句:alert(strTest);輸出結果依然會是undefined,看到這我想大家應該也想到了,程序出錯的原因并不是說聲明了一個與全局變量名稱相同的局部變量,而是只要在變量聲明語句之前調用該變量,該變量的值就一定是 undefined,但是如果我們調用一個沒有被聲明的變量,這個時候會報“變量未定義”的錯誤,所以我們還必須得明白這兩者之間的區別,不過不管怎么說,一種好的編碼習慣還是避免把局部變量與全局變量聲明稱相同的名字!
      在看最后一種情況:注意以下程序:
     1         var strGloblVar = "我是全局變量";
     2         function father(){
     3             strFatherGloblVar = "在父函數中聲明的全局變量";
     4             var strFatherVar = "我是父函數中為局部變量,同時也是子函數中的全局變量";
     5             function child(){
     6                 strChildGloblVar = "在子函數中聲明的全局變量";
     7                 var strChildVar = "我是子函數中的局部變量";
     8                 alert(strFatherVar);  //output: "我是父函數中為局部變量,同時也是子函數中的全局變量"
     9                 alert(strChildVar);   //output: "我是子函數中的局部變量"
    10                 alert("子函數中:"+strGloblVar);   //output: "我是全局變量"
    11                 alert(strFatherGloblVar);
    12             }
    13             alert("父函數中:"+strGloblVar); //output: "我是全局變量"
    14             //alert(strChildVar); //error: strChildVar 未定義
    15             //alert(strChildGloblVar);  //error:strChildGloblVar 未定義
    16             return child();
    17         }
    18         
    19         father();
    20         alert("所有函數外部:"+strFatherGloblVar); //output: "所有函數外部:在父函數中聲明的全局變量"
    21         alert("所有函數的外部:"+strChildGloblVar); //output:"所有函數的外部:在子函數中聲明的全局變量"
       用過JavaScript閉包的人會很容易的看懂以上程序,閉包不是本文要說明的重點,但是這個小例子可以幫我們證明在閉包的情況下,變量的生命周期并沒有因為使用閉包而有很大的改變,可以簡單的拋開閉包的概念,把father()函數內部看成一個獨立的運行環境。14行報錯,是因為strChildVar是child()函數中定義的局部變量,15行報錯,是因為在調用strChildGloblVar之前child()函數未被執行過,這和我們之前說的都一樣。但是當我們在father()函數外部打印strFatherVar的時候會出現錯誤,導致這種錯誤的原因很簡單,strFatherVar雖然是child()的全局變量,但是卻是father()的局部變量。
    posted on 2008-06-27 17:04 零全零美 閱讀(3224) 評論(4)  編輯  收藏 所屬分類: JavaScript

    FeedBack:
    # re: JavaScript學習筆記(1)變量的生命周期
    2008-07-02 09:54 | eureka
    無所謂真正的“全局變量”。
    In top-level JavaScript code (i.e., code not contained within any function definitions), the scope chain consists of a single object, the global object. All variables are looked up in this object. If a variable does not exist, the variable value is undefined. In a (nonnested) function, however, the scope chain consists of two objects. The first is the function's call object, and the second is the global object. When the function refers to a variable, the call object (the local scope) is checked first, and the global object (the global scope) is checked second.
    摘自犀牛書 4.7節  回復  更多評論
      
    # re: JavaScript學習筆記(1)變量的生命周期
    2008-07-03 09:11 | 龐永慶
    你好 我是出版社的編輯,我看到你博客中的內容,感覺寫的非常不錯,現在也正要出版一本JavaScript的書。如果想把JavaScript內容和更多的人分享,可以和我聯系,把這些東西寫成書。
    我的郵箱:books_522008@yahoo.com.cn  回復  更多評論
      
    # re: JavaScript學習筆記(1)變量的生命周期
    2008-07-04 09:54 | 昨夜流星
    @eureka
    呵呵,學習中,談談自己的觀點:
    JavaScript是一種解釋型的腳本語言,無法實現如JSP session 級別的變量更別說application級的了。
    也許我文中的說法不太嚴謹應該指出:
    JavaScript中所謂的全局變量,其實只是page scope,而不是真正的application scope  回復  更多評論
      
    # re: JavaScript學習筆記(1)變量的生命周期
    2013-08-02 10:27 | fwd
    寫的很好  回復  更多評論
      
    主站蜘蛛池模板: 亚洲av无码专区在线| 在线观看肉片AV网站免费| 亚洲第一区香蕉_国产a| 国产又大又粗又硬又长免费 | 免费下载成人电影| 99视频免费在线观看| 亚洲av成人一区二区三区在线播放 | 亚洲乳大丰满中文字幕| 国产a不卡片精品免费观看| 国产成人精品免费视频动漫| ssswww日本免费网站片| 337P日本欧洲亚洲大胆艺术图 | 3344永久在线观看视频免费首页| 国产精品福利片免费看| 校园亚洲春色另类小说合集| 亚洲香蕉在线观看| 亚洲成人免费在线观看| 亚洲AV无一区二区三区久久| 中文字幕亚洲综合久久菠萝蜜| 亚洲欧洲日产国码在线观看| 久久久青草青青亚洲国产免观| 国产精品亚洲不卡一区二区三区| 成年人视频在线观看免费| 99精品视频在线视频免费观看| 成人免费ā片在线观看| 二区久久国产乱子伦免费精品| 牛牛在线精品免费视频观看| 亚洲高清乱码午夜电影网| 亚洲一区二区三区丝袜| 亚洲综合av一区二区三区不卡| 久久精品国产亚洲av麻豆蜜芽| 亚洲国产高清美女在线观看 | 2019中文字幕免费电影在线播放| 日本亚洲欧洲免费天堂午夜看片女人员| yellow视频免费在线观看| 男女一边摸一边做爽的免费视频| av片在线观看永久免费| 三年片免费高清版| 久久美女网站免费| 18禁止看的免费污网站| 可以免费看的卡一卡二|