Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:可变范围&;全球化的罪恶_Javascript_Ajax_Variables_Global - Fatal编程技术网

Javascript:可变范围&;全球化的罪恶

Javascript:可变范围&;全球化的罪恶,javascript,ajax,variables,global,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 numerou

我想做个好人,真的,但我不知道怎么做:)

如果您有任何关于如何在此处不使用全球搜索引擎的建议,我们将不胜感激。让我们称之为全球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构建的

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


谢谢。

我不知道这是不是一种选择

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

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

(function() {
    // Your code goes here
})(); // Called right away
你可以把任何东西放在那里,在一个狭窄的范围内,任何东西都可以访问,但它们仍然不是全球性的


另外,如果您的文件是唯一的文件,请停止避免使用globals,因为除非您正在制作某种可重用的组件,否则不会有任何危害。

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

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

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

        function C() {
            B();
        }

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

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

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

作为函数参数传递的Ajax结果 因为,G的计时是这样的,所以在调用A中的成功处理程序之前,它不能被使用,那么也许您只是将其作为参数传递给B,而不需要将其作为全局函数

根据需要检索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
}

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

将所有内容都放在一个闭包中?:p(function(){}()//这是一种非常优雅的限制变量范围的方法。它很方便,但作为可移植性的练习,我认为学习如何避免依赖常规变量很重要,除非它们被封装在某种名称空间中,您可以随意移动。但是是的,如果你已经有了一堆全局变量,那么这是最好的快速修复方法,并且是在一个站点上编写功能包时避免名称空间冲突的一个好方法,而这个站点将受到另一组开发人员的攻击。这是一个很好的理论观点,尽管在实践中函数a的价格是$(文档).准备好了,这样就不会发生:)这不是理论上的。。我意识到
A
在就绪时启动,但是
A
发出AJAX请求,对吗?响应不会立即可用。当用户单击调用C或D的其中一个DOM元素(这反过来又调用B)时,会发出AJAX请求。所以在实践中,它应该只是理论上的:)这有助于了解。谢谢。一般来说,如果它是某种潜在的大型/复杂结构,在大多数语言中,它将作为引用而不是副本传递。在JS中,我确信这一点。嗨,我的老朋友:)(请原谅这个双关语——我肯定比你更有趣!)我本可以勾选你的答案,但我想我会分享这份爱。关于您的评论,“……通常不需要存储DOM元素引用”,我有两个问题。(1) 什么指示我将DOM ID存储在VAR中?(2) 更重要的是,对于大函数,我的事件处理程序调用.on('click',function(event){myfn(v1,v2);});如果可能的话,我喜欢命名大函数。但这会拒绝访问“This”。这是不明智的吗?fns不在var中传递id的情况下,能知道这个方法调用了什么吗?您多次引用DOM元素,所以我认为您对它们有问题。只需使用
myfn.call(this,v1,v2)
而不是
myfn(v1,v2)
即可控制函数中设置的
this
。看,谢谢。同样,这是有帮助的。
var myMainGlobal = {};

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

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