2012-10-08 48 views
1

我想要將我的代碼分解爲模塊,並且引用我的應用程序的其他模塊時遇到問題。在全局變化時,針對globar var的私有變量不會改變

MYAPP = (function(my_app) 
{ 

    var funcs = my_app.funcs; 

    var module2 = 
    { 
     stupid_function = function() 
     { 
      var some_var = "auwesome!"; 

      //let's call something from the other module... 
      funcs.do_whatever(); 
     }; 

    }; 

    my_app.module2 = module2; 

    return my_app; 

})(MYAPP); 

問題出現在MYAPP.funcs更改時。例如,當我初始化它並添加新方法...因爲「funcs」是在閉包內部創建的,它有一個MYAPP.funcs的副本,並且沒有我需要的新東西。

這是「funcs」獲取更多方法的方式......當我執行方法MYAPP.funcs.init()時,MYAPP.funcs會自行重寫。

var MYAPP = (function (my_app, $) 
{ 

    'use_strict'; 

    my_app.funcs = {}; 

     my_app.funcs.init = function() 
     { 
      panel = my_app.dom.panel; 
      funcs = my_app.funcs; 
       query_fns = funcs.query; 

       my_app.funcs = 
       { 
         some_method: function() { ... }, 
         do_whatever: function() { ... } 
       }; 

      }; 


    return my_app; 

}(APP, jQuery)); 

在此先感謝!


如果它是任何人都感興趣...

我使用moduling的方法是「緊增強」 http://webcache.googleusercontent.com/search?hl=es-419&q=cache%3Aadequatelygood.com%2F2010%2F3%2FJavaScript-Module-Pattern-In-Depth&btnG=

+0

如果'MYAPP.funcs'是一個對象,然後在創建它不會有所作爲。你沒有它的「拷貝」,你引用了它,所以每當你添加新的函數時,所有引用都將可見。我沒有在你的代碼中看到你正在更新'funcs',但是我確實看到,在將其分配給'my_app'之前,您正在創建一個隱式全局變量'module2'。不知道你爲什麼要在那裏使用全球。 –

+0

是的,我的不好。我只是修正了隱含的var錯誤。 MYAPP.funcs是一個對象。在我的代碼中,沒有增加MYAPP.funcs的例子。我需要加載DOM才能完全定義模塊,因此我所做的是創建一個MYAPP.funcs.init方法,在我調用它時重寫MYAPP.funcs。我更好地提高了我的例子,一秒... 謝謝 – bgusach

+0

如果您要說*用新對象替換*'MYAPP.funcs',那麼會丟失舊數據。您應該更新*對象而不是替換它。 –

回答

0

無關的模塊或全球的...不同的是,如果你正在改變對象變量指向或什麼變量指向:

var first = {my:"test"}; 
var second = first; // second points to object {my:"test"} 
first.foo = 42; // updating the object, second points to it and can see the change 
first = {my:"other"}; // new object, second still points to old {my:"test", foo:42} 
+0

看起來像這樣,因爲我有方法MYAPP.funcs.init覆蓋自身並重新定義一個新的對象,而無需init方法。 我要檢查,但看起來完全一樣!謝謝! – bgusach