2

我正在努力变得好,我真的是,但我不知道该怎么做:)

任何关于如何在此处不使用全局变量的建议将不胜感激。我们称其为全局 G。

Function A 
  Builds G by AJAX

Function B
  Uses G

Function C
  Calls B
  Called by numerous event handlers attached to DOM elements (type 1)

Function D
  Calls B
  Called by numerous event handlers attached to DOM elements (type 2)

我看不出如何在这里使用全局变量。DOM 元素(类型 1 和 2)是在与 A 无关的其他函数 (E&F) 中创建的。我不想将 G 添加到每个事件处理程序中(因为它很大并且有很多这些事件处理程序),并且做所以需要与我在这里寻求的相同类型的解决方案(即,让 G 到 E&F)。

全局 G,顺便说一句,是构建其他元素所必需的数组,因为它们又是由 AJAX 构建的。

我也不相信单例是真正的解决方案。

谢谢。

4

5 回答 5

6

当然,将所有内容都放在一个立即执行的大型函数中!

(function() {
    // Your code goes here
})(); // Called right away

你可以把任何东西放在那里,它可以被更窄范围内的任何东西访问,但它们仍然不是全局的。

另外,如果您的文件是唯一的文件,请停止避免使用全局变量,因为除非您正在制作某种可重用的组件,否则这真的没有害处。

于 2012-04-12T23:12:04.827 回答
2

我不知道这是否是一个选项?

Function Everything() {
  var G

  Function A 
    Builds G by AJAX

  Function B
    Uses G

  Function C
    Calls B
    Called by numerous event handlers attached to DOM elements (type 1)

  Function D
    Calls B
    Called by numerous event handlers attached to DOM elements (type 2)
}();
于 2012-04-12T23:11:56.803 回答
2

不用担心在事件中传递 G。它只是对实际对象的引用,而不是副本,因此不会导致内存问题。函数、对象和数组作为引用传递。

于 2012-04-12T23:25:20.147 回答
1

如果在您收到 AJAX 响应之前触发了一个事件处理程序(依赖于 G),会发生什么情况?要解决这个问题,并通过闭包将 G 绑定到 B,您可以尝试在 AJAX 回调中装配事件处理程序:

function A() {
    ajaxLoad(function(G) {
        attachEvents1(C);
        attachEvents2(D);

        function B() {
            G.use();
        }

        function C() {
            B();
        }

        function D() {
            B();
        }
    });
}
于 2012-04-12T23:16:19.927 回答
1

您没有向我们提供很多信息来了解最佳替代方案是什么,但这里有一些一般类型的选项:

Ajax 结果作为函数参数传递

Function A() { 
  Builds G by AJAX
  B(G)
}

Function B(g) {
  Uses g
}

因为,G 的时间是这样的,直到 A 中的成功处理程序被调用,所以也许你只是将​​它作为参数传递给 B 并且不需要它作为全局。

按需检索的 DOM 元素

对于 DOM 元素,通常不需要将 DOM 元素引用存储在 javascript 变量中。如果您给他们适当的 ID,那么您可以在需要时使用document.getElementById("idName").

如果您确实需要在众多事件和函数中可用的持久变量,那么您有两种选择:

无需全局变量即可共享持久数据的自执行函数闭包

您可以将它们存储在自执行函数闭包中:

(function() {

var G = [];

Function A 
  Builds G by AJAX

Function B
  Uses G

})();

单个全局对象

创建一个真正的全局,然后将其他数据存储为属性:

var myMainGlobal = {};

myMainGlobal.G = [];
myMainGlobal.A = function() {
  Builds myMainGlobal.G by AJAX
}

myMainGlobal.B = function() {
  Uses myMainGlobal.G
}

这至少只创建了一个实际的顶级全局符号,同时让您拥有所需的尽可能多的全局数据。

于 2012-04-12T23:52:41.067 回答