为什么不是';我的JavaScript函数不能访问其他.js文件中定义的全局作用域函数/变量吗?

为什么不是';我的JavaScript函数不能访问其他.js文件中定义的全局作用域函数/变量吗?,javascript,Javascript,我写了一个这样的剧本: NS.load = function(src) { var script = document.createElement("script").setAttribute("src", src); document.getElementsByTagName("head")[0].appendChild(script); } 它加载文件,但我无法访问其他文件中定义的函数和变量 //js/main.js var qux = {name: "name"}; NS

我写了一个这样的剧本:

NS.load = function(src) {
    var script = document.createElement("script").setAttribute("src", src);
    document.getElementsByTagName("head")[0].appendChild(script);
}
它加载文件,但我无法访问其他文件中定义的函数和变量

//js/main.js
var qux = {name: "name"};
NS.load("js/foo.js");

//js/foo.js
alert(qux.name); //undefined variable
但如果我这样定义qux:

window.qux = {name: "name"};
我可以在其他模块中访问qux变量。据我所知,所有全局对象都已经是window对象的成员。所以为什么我必须定义这样的变量。你能提供另一种方法吗


谢谢。

您似乎试图通过在一行上调用
createElement
setAttribute
来缩短代码的快捷方式,但是
setAttribute
没有返回任何内容,因此您无法在其返回值上调用
appendChild
,因为没有。这将解决此问题:

NS.load = function(src) {
    var script = document.createElement("script");
    script.setAttribute("src", src)
    document.getElementsByTagName("head")[0].appendChild(script);
}
编辑:

您在什么样的环境中运行代码?是跨站点发生了什么事情,还是在另一个函数中定义了qux?以下内容对我很有用,通过


当页面加载时,我会收到一个带有“name”的警报。

谢谢Langdon。实际上,原始代码与您的代码相同。我把它剪短了。但我不知道setAttribute()返回值。了解这一点很好。您的代码正在运行。“您在什么样的环境中运行代码?”这是问题和答案。现在我明白了。实际上,我的加载程序代码在jQuery的ready方法中,因此我必须将变量绑定到window对象才能到达其他模块。谢谢你,兰登。
<html>
<head>
    <script type="text/javascript">
        load = function(src) {
            var script = document.createElement("script");
            script.setAttribute("src", src);
            document.getElementsByTagName("head")[0].appendChild(script);
        }
        var qux = {name: "name"};
        load("foo.js");
    </script>
</head>
<body></body>
</html>
alert(qux.name);