Javascript:可变范围&;全球化的罪恶
我想做个好人,真的,但我不知道怎么做:) 如果您有任何关于如何在此处不使用全球搜索引擎的建议,我们将不胜感激。让我们称之为全球GJavascript:可变范围&;全球化的罪恶,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
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
}