我想要变得更好,我真的很好,但我看不出怎么做:)
关于如何不使用全球的任何建议将不胜感激。我们称之为全球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构建的。
我也不相信单身人士是真正的解决方案。
感谢。
答案 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)
您没有向我们提供大量信息以了解最佳替代方案,但以下是一些常规类型的选项:
Function A() {
Builds G by AJAX
B(G)
}
Function B(g) {
Uses g
}
因为G的时序是这样的,直到A中的成功处理程序被调用才能使用它,那么也许你只需将它作为参数传递给B而不需要它作为全局。 / p>
对于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
}
这至少只会创建一个实际的顶级全局符号,同时让您拥有所需的全局数据。