Javascript:变量范围&全局的邪恶

时间:2012-04-12 23:07:36

标签: javascript ajax variables global

我想要变得更好,我真的很好,但我看不出怎么做:)

关于如何不使用全球的任何建议将不胜感激。我们称之为全球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,BTW,是构建其他元素所必需的数组,因为它们是由AJAX构建的。

我也不相信单身人士是真正的解决方案。

感谢。

5 个答案:

答案 0 :(得分:6)

当然,将所有东西都放在一个立即执行的大功能中!

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

你可以把任何东西都放在那里,任何东西都可以在更窄的范围内使用,但它们仍然不会是全球性的。

另外,如果你的文件是唯一的文件,请停止避免使用全局文件,因为除非你制作某种可重复使用的组件,否则确实没有坏处。

答案 1 :(得分: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)
}();

答案 2 :(得分:2)

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

答案 3 :(得分: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();
        }
    });
}

答案 4 :(得分:1)

您没有向我们提供大量信息以了解最佳替代方案,但以下是一些常规类型的选项:

Ajax结果作为函数参数传递

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

Function B(g) {
  Uses g
}

因为G的时序是这样的,直到A中的成功处理程序被调用才能使用它,那么也许你只需将它作为参数传递给B而不需要它作为全局。 / p>

按要求检索的DOM元素

对于DOM元素,通常不需要在javascript变量中存储DOM元素引用。如果您为他们提供了适当的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
}

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