都是全局變量惹的禍


        全局變量之“禍”由來已久, 人所共“憤”,  但平時在做開發時, 常常還是不自覺地依靠全局變量, 比較便捷, 也容易出很隱蔽的BUG 。

        最近發現了一例, 做了簡化處理, 不過本質是一樣的, 供大家日後借鑑。

        var  global = null;      // 全局變量常常不會如此明顯地自我標識, 不過要特別注意 public 變量

        var obtainGlobal = function() {
              return global;
        }

        var  init = function() {
              global =  { "a": 1, "b":  null };      
        }

        var  search = function() {
               console.log(global);  
        } 

       var  another = function() {
              var xx = obtainGlobal();
              xx.b = "I am back";   //   這裏被隱蔽地修改了, 引用變量的屬性被修改 
       }

       init(); 
       search();
       another();
       search();

       結果: 
         Object {a: 1, b: null}
  Object {a: 1,b: "I am back"}

       BUG 出現的過程是:
       STEP1:  應用啓動, 調用 init() 方法初始化 global;
       STEP2:  查詢操作, 調用 search() 方法, 此時獲取的 b 是 null;
       STEP3:  另一個操作, 調用 another() 方法, 這裏巧妙地修改了全局變量, 將 b 賦值爲 "I am back";
       STEP4:  再次查詢操作, 調用 search() 方法, 此時獲取的 b 是 "I am back".

       應用中, b 應該是顯示的; 當時百思不得其解, 爲什麼有的時候可以顯示 b , 有的時候不能顯示 b; 在初始化的時候, 發現 b 是沒有被顯示的, 後來又被修改了, 但又始終找不到在哪裏被修改了。 
       
       這裏由於代碼比較少, 因此, 相對容易看到問題的存在; 當出現在項目中時, 這些全局變量的讀取和修改就變得非常隱蔽, 掩藏在代碼海洋中, 再也難以尋見, 注意到, 這裏無法通過 IDE 的搜索功能搜索到 global 被修改的痕跡。
       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章