使用Javascript:变量的作用域和全局的罪恶([removed] variable scope

2019-09-16 12:14发布

我想好,我真的很,但我看不出怎么办呢:)

如何不使用全局这里任何意见将不胜感激。 让我们把全球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)在其他功能(E&F),这是未连接与A.我不想至G添加到每个事件处理(因为它的大,有很多这样的事件处理程序)创建的,和做所以需要同一种解决方案,因为我正在寻找在这里(即,让克至E&F)。

全球G,顺便说一句,是一个数组,它是必要建立其他元素,因为他们又通过AJAX建造。

我不相信,一个单是真正的解决方案,无论是。

谢谢。

Answer 1:

在一个大的立即执行的功能,当然坚持一切!

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

你可以把任何东西在那里,这将是在一个较窄的范围内的任何访问,但他们仍然不会是全球性的。

另外,如果你是唯一的文件,停止避免全局,因为真的没有伤害,除非你正在做某种可重用的组件中。



Answer 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)
}();


Answer 3:

不要担心路过的G事件。 这只是实际的对象,而不是一个副本的引用,因此它不会造成内存问题。 函数,对象和数组作为参考传递。



Answer 4:

如果事件处理程序(即依赖于G)之一,你已经收到了AJAX响应之前被激发,会发生什么? 为了解决这个问题,并通过关闭至G B结合,你可以尝试在AJAX回调拼凑事件处理程序:

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

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

        function C() {
            B();
        }

        function D() {
            B();
        }
    });
}


Answer 5:

你不给我们提供了很多的信息,知道的最佳替代品是什么,但这里有一些一般类型的选项:

阿贾克斯结果作为传递函数参数

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

Function B(g) {
  Uses g
}

因为,G的时间是这样的,它不能被使用,直到在一个成功的处理程序反正叫,那么也许你只是把它传递给B作为参数,不需要它作为一个全球性的。

DOM元素检索根据需求

对于DOM元素中,通常不要求存储在JavaScript变量DOM元素的引用。 如果你给他们适当的标识,并可以根据需求随时需要与他们获取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
}

这至少只创建一个实际的顶级全球性的象征,同时让你,因为你需要有尽可能多的全球性数据。



文章来源: Javascript: variable scope & the evils of globals