2012-10-10 41 views
0

我以未确定的顺序加载了我的JavaScript。我有一个名称空间函数来注册名称空间。例如,它可以编写这样的事:以随机顺序加载的Javascript无法初始化

"com.stackoverflow.question".namespace(new function() { 
    this.sayHelloTo = function(text) { alert("Hello" + text); } 
}); 

不幸的是,namespace.js并不总是首先加载,如加载顺序是随机的,但其他脚本使用的命名空间功能。有没有办法实现这一点,而不会得到错误“.namespace”ist不是一个函数?

所以必须有一种方法来初始化后面的sayHelloTo定义,我有一切都是加载事件。所以即将发表的声明有效,但我认为这非常丑陋。

var postInit = postInit || []; 
postInit.push(function() { 
    "com.foo.bar".namespace(new function() { 
     this.sayHelloTo = function(text) { alert(text); } 
    }); 
}); 

而当事件发生时:

list.foreach(function(k, v) { v.call(); }); 

有没有什么更好的方法来实现这一目标?

回答

1

使用AMD:看看http://requirejs.org/。或者,common.js可能取决于使用情况。

+0

对不起,我忘了提及我不能在自己的JavaScript包括。我不在浏览器环境中,我在一个框架中,js文件以随机顺序编译。所以我没有访问权限或可能性来加载/需要脚本。 – codevour

+0

什么样的框架包含随机顺序的js文件?你在用什么? – manzoid

+0

它稍微复杂一些,但同样的原则适用。您也可以将一个库复制并粘贴到您坚持使用的代码中(没有任何关于需求的浏览器)。 将每个具有依赖项的函数都包装在一个外部函数中,然后将该外部函数附加到加载依赖项时处理的队列中(如果您对它们适用,则使用事件)。如果由于某种原因你甚至无法做到这一点,那么轮询命名空间定义可能是唯一的选择,并在那个时候处理队列。 –