【问题标题】:Private var aiming at globar var does not change when the global changes全局变化时针对全局变量的私有变量不改变
【发布时间】:2012-09-28 21:17:36
【问题描述】:

我正在尝试将我的代码分解为模块,但在引用我的应用程序的其他模块时遇到问题。

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));

提前致谢!!


如果有人感兴趣的话……

我用于调制的方法是“紧密增强”http://webcache.googleusercontent.com/search?hl=es-419&q=cache%3Aadequatelygood.com%2F2010%2F3%2FJavaScript-Module-Pattern-In-Depth&btnG=

【问题讨论】:

  • 如果MYAPP.funcs 是一个对象,那么它的创建位置没有区别。你没有它的“副本”,你引用它,所以每当你添加新函数时,所有引用都可以看到它。我在你的代码中看不到你正在更新funcs,但我确实看到您在将其分配给my_app 之前创建了一个隐式全局变量module2。不知道为什么要在那里使用全局变量。
  • 是的,我的错。我刚刚修复了隐含的 var 错误。 MYAPP.funcs 是一个对象。在我的代码中,没有关于如何扩充 MYAPP.funcs 的示例。我需要加载 DOM 以完全定义模块,所以我要做的是创建一个 MYAPP.funcs.init 方法,该方法在我调用它时重写 MYAPP.funcs。我最好改进我的例子,一秒钟......谢谢
  • 如果你说你用一个新对象替换 MYAPP.funcs,那么是的,你会丢失旧数据。您可能应该更新对象而不是替换它。
  • 这就是我一直用于更新的方式......现在我发现重写对象并不是最好的方式。谢谢!

标签: javascript closures globals


【解决方案1】:

与模块或全局无关...不同之处在于您更改对象变量指向或变量指向的对象:

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}

【讨论】:

  • 看起来像这样,因为我有方法 MYAPP.funcs.init 覆盖自己并重新定义一个没有 init 方法的新对象。我要检查,但看起来完全一样!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
相关资源
最近更新 更多