于吉吉的技術博客

          建造高性能門戶網

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            65 隨筆 :: 6 文章 :: 149 評論 :: 0 Trackbacks
          今天在寫個一段js代碼出現了變量值出現異常的問題,把代碼做了提取,簡單的如下面

          <script>
          function a1(){
              
          var a = [{"name":"1"},{"name":"2"},{"name":"3"}];
              
          for(i=0;i<a.length;i++){
                  alert(i
          +" first");
                  a2(a[i]);
                  alert(i
          +" second");
              }
          }
          function a2(obj){
              
          for (i in obj) {
              }
              
          return "hello";
          }
          </script>
          <body onload="a1();">


          在第一次alert(i)是 0 first
          在第二次alert(i)是 name second

          為什么會出現這樣的情況,明明在a2函數傳進去的是實參,并且也沒有對參數a[i]進行改寫
          在反復查看問題后發現是i變量的問題,在函數a1()中,i被定義成為了全局變量,而在函數a2()中,i又是一個全局變量,所以在a2的for (i in obj) 循環中i被重新賦值成"name"
          這個烏龍是沒有養成在一些臨時函數定義成局部變量造成的,特別是在一些for,while,if的操作中,臨時變量必須定義成局部變量否則會出現全局變量被改寫的情況。

          再回顧一下定義全局變量/局部變量的規則
          在函數外部,使用var,或直接使用變量,如var a=1;或 a=1; 就定義了全局變量
          在函數內部,直接使用變量,如a=1;也定義了全局變量
          在函數內部,使用var進行定義就是局部變量

          修改一下上面的代碼

          <script>
          function a1(){
              
          var a = [{"name":"1"},{"name":"2"},{"name":"3"}];
              
          for(var i=0;i<a.length;i++){
                  alert(i
          +" first");
                  a2(a[i]);
                  alert(i
          +" second");
              }
          }
          function a2(obj){
              
          for (var i in obj) {
              }
              
          return "hello";
          }
          </script>
          <body onload="a1();">
          posted on 2011-06-02 16:11 陳于喆 閱讀(970) 評論(0)  編輯  收藏 所屬分類: web開發
          主站蜘蛛池模板: 香港| 根河市| 鄱阳县| 桃源县| 清水河县| 深圳市| 新丰县| 屏边| 兴海县| 朔州市| 和田市| 同仁县| 汤阴县| 任丘市| 巴马| 台江县| 金寨县| 马边| 漳浦县| 武川县| 神农架林区| 喀喇沁旗| 客服| 祁门县| 长寿区| 榆中县| 灌南县| 丹江口市| 陆丰市| 名山县| 璧山县| 泸西县| 金川县| 云龙县| 三台县| 鹤峰县| 二连浩特市| 福安市| 屯门区| 英德市| 松江区|