在另一个javascript文件中使用javascript文件中声明的全局变量

时间:2013-09-24 01:56:52

标签: javascript object include literals

我正在尝试获取TestService.Server.WWW_SERVER_URL,但TestService.Server未定义。 当我调用test1()时,它运行良好。但我无法访问对象文字TestServer。 有不同的方式吗?

的test.html

<script type="text/javascript" language="javascript" src="TestService.js"></script>
<script type="text/javascript" language="javascript">
    function test() {
        alert("TestService.Server.WWW_SERVER_URL[" + TestService.Server.WWW_SERVER_URL + "]");
        //test1();
    }
</script>

TestService.js

document.write("<scr" + "ipt type='text/javascript' src='TestServer.js'><" + "/scr" + "ipt>");

var TestService = {
    Server: TestServer,
    Delimiter: ""
};

function test1() {
    test2();
}

TestServer.js

var TestServer = {
    WWW_SERVER_URL: "http://www.test.com"
};


function test2() {
    alert("test2 has been called!");
}

2 个答案:

答案 0 :(得分:0)

你在TestService.js

中有这个
document.write("<scr" + "ipt type='text/javascript' src='TestServer.js'><" + "/scr" + "ipt>");

var TestService = {
    Server: TestServer,
    Delimiter: ""
};

您正尝试在TestService中设置一个尚未加载TestServer的属性,因为您没有为新添加的脚本加载时间

由于TestService.Server尚不存在,

undefined将评估为TestServer

设置一个onload函数,它将添加你的脚本,然后在加载

时设置你的TestService.Server变量
var TestService = {
    Server: null,
    Delimiter: ""
};

function test1() {
    test2();
}

window.onload = function() {
    var head = document.querySelector("head");
    var script = document.createElement("script"); 
    script.setAttribute("type", "text/javascript");
    script.setAttribute("src", "TestServer.js");

    head.addEventListener("load", function(event) {
        if (event.target.nodeName === "SCRIPT"){
            TestService.Server = TestServer;
        }
    }, true);

    head.appendChild(script); 
}

答案 1 :(得分:0)

  

如果您动态附加脚本,IE,Firefox和Chrome都可以   以异步方式下载脚本。

     

Firefox和Chrome将等待所有异步请求返回   然后将按照附加的顺序执行脚本   DOM但是IE按照它们的顺序执行脚本   通过电线返回。

     

source

在您的情况下,您无法保证TestServer.jsTestService.js之前执行。因此,我建议您更改访问全局变量交叉文件的方式。

您可以在TestServer.js之前将TestService.js添加到您的html,这样他们就可以逐个执行。

无论如何,不​​建议做这样的事情,你可以将它们包装在你自己的命名空间中。另外,在使用之前,最好检查一下您要使用的变量是否未定义。