2016-02-20 77 views
2

我有多个.js文件下的一个命名空间,假设我的命名空间是foo,每个文件中我有一个像下面的代码:需要JavaScript头文件吗?

在文件utils.js

(function() { 

    window.foo = window.foo || {}; 
    foo.utils = foo.utils || {}; 
    foo.bar = foo.bar || {}; 

    var utils = foo.utils; 
    var bar = foo.bar; 

    utils.helper1 = function(abc) { 

     var xyz = bar(abc); 
     ... 
    } 

})(); 

基本上在每个js文件,我想有像var utils = foo.utils这样的代码,所以我不必每次都写foo.utils。但是,我必须在顶部写foo.utils = foo.utils || {};,因为utils.js可能尚未加载。

我认为要解决这一方法是有一个头文件,并确保它总是首先加载,就基本宣告我的命名空间下的所有公共职能象下面这样:

window.foo = windown.foo || {}; 
foo.bar = {}; 
foo.baz = {}; 
foo.utils = {}; 

有没有更好的办法?我不想确保我的js文件的加载顺序。

回答

4

这听起来像你已经知道的选择。

  1. 脚本加载顺序不受控制。确保每个单独的文件在使用之前初始化名称空间中的每个对象(如您的示例所示)。

  2. 确保首先加载的一个文件将初始化名称空间。您将名称空间初始化代码放入一个文件中,并确保首先加载该文件。其他文件则知道名称空间已经被初始化,所以他们不必这样做。

有没有更好的办法?

不,不是真的。除了这些选择之外,没有捷径。如果您不想强制执行任何特定的加载顺序,那么在分配给它之前,您需要使用样板初始化名称空间。

还有其他一些混合选项,例如您定义了一个函数,让您可以分配给一个名称空间,并且该函数将为您创建名称空间(如果它尚不存在)。但是当然,你必须确保这个函数已经被首先加载了,所以它不能真正为你节省很多。

+0

3.在JavaScript插入之前(可能位于头文件中),您可以在HTML中嵌入变量。但这不是一个理想的解决方案,因为每次加载页面时都会传输它(无缓存),并将HTML与JavaScript混合在一起。 –

+0

@ ssc-hrep3 - 我想这在技术上是一个选项,但是您必须将该代码复制到每个HTML文件中,并且它仍然是顺序敏感的,因为您必须在加载相关脚本之前将其复制。而且,如果您必须进行更改,则必须修改每个HTML文件。我想我看不出比我们已有的选项2更好。 – jfriend00

+0

有趣的是,我没有JavaScript的行业经验,所以我认为可能会有一些共识解决方案,或者一些我不知道的JavaScript魔法。谢谢! – Arch1tect