Javascript 从其他JS文件访问全局变量

Javascript 从其他JS文件访问全局变量,javascript,jquery,global-variables,Javascript,Jquery,Global Variables,这是我的主文件: $(document).ready(function () { function Page() { this.menu = new Menu(); this.management = new Management(); this.text = "text"; } window.Page= Page(); }); 现在我想从每个其他JS文件访问页面: 我试过这个: console.log(Page.text); console.log(wind

这是我的主文件:

$(document).ready(function () {
  function Page() {
    this.menu = new Menu();
    this.management = new Management();
    this.text = "text";
  }
window.Page= Page();
});
现在我想从每个其他JS文件访问页面:

我试过这个:

console.log(Page.text);
console.log(window.Page.text);
给我:
未捕获引用错误:未定义页面

我试过这个:

console.log(Page.text);
console.log(window.Page.text);
给我:
未捕获类型错误:无法读取未定义的属性“text”


我做错了什么?

您需要使用
window.Page=new Page()

函数定义不需要位于
文档.ready()中。只有在DOM准备就绪时需要立即执行的操作才需要放在其中。因此,将函数移到顶层。

或者

window.Page = new Page();

然后确保其他脚本在声明window.Page之前不会尝试使用它。您可以在document.ready()回调函数中声明它,因此只有在DOM就绪并启动回调函数后才能访问它

编辑:

如果没有上下文,我不确定这正是您想要做的,但我认为您只需要一个带有一些属性/方法的全局页面对象。创建它的最简单方法是

window.Page = {
    menu : new Menu(),
    management = new Management(),
    text = "text"
};
没有document.ready()包装器。
显然,在执行此代码之前,需要定义
菜单
管理
。如果其中任何一个函数依赖于DOM,只需将所有脚本移到文档末尾即可。任何需要访问window.Page的脚本都必须包含在此脚本之后。

您的问题是,在Page函数中,您没有在全局上下文中创建任何新对象。您正在当前上下文中创建新菜单和新管理实例

另外,通过调用Window.Page=Page(),可以将Page函数的结果(为void)分配给Window.Page对象

我建议你做一些类似的事情:

//- from any js file 
    function createPage() {
            var newPage = { title : 'new page', count : '2' };
            return newPage;
          }
    window.Page = createPage();

注意,对于这个示例,我已经用虚拟内容替换了您的菜单和管理属性。样本可用@

更新:代码已经更新,以说明多个js文件的正确用法


希望这有帮助

您能将主功能移到
文档之外吗?准备好了吗?
?我的“猜测”是
window.Page=..
在console.log语句之前没有执行-
Page.text
上的引用错误只有在未设置window.Page属性时才会发生。请记住,
ready
是一个异步操作/回调。(仅变量查找将导致引用错误;失败的属性查找将计算为
未定义的
——因此访问
窗口。页面
计算为
未定义的
(未定义).text
导致TypeError。但是,ReferenceError是需要注意的事项。)我现在正在为变量定义未定义。。。这和他已经拥有的不一样吗?(请注意,这是一个引用错误。)如果为窗口属性
Page
分配了任何值(即使
未定义
),则
Page.text
不会导致引用错误。因为它确实抛出了引用错误,所以可以推断,
window.Page=..
根本没有执行;或者,至少不要在console.log语句之前。现在console log打印出
undefined
。现在console log打印出
undefined
。我不明白你的意思,当然你需要等待这个对象被创建后再访问它,或者在需要时创建它。我会说,如果涉及多个JS库,您应该考虑在DoTr.Read状态下访问任何内容,因为这将确保所有的库都将被加载。在任何情况下,如果您在没有任何“思考”的情况下访问值,您将永远无法避免错误,因为您不知道库的加载顺序。另外,考虑到最初的问题,我认为这个答案是正确的(并且这个注释应该有助于sync.issue),虽然同步很重要(我怀疑原始错误与此相关),但原始代码在运行时会创建一个全局属性,即
window.Page
。分配给
window.Page
的值与导致(或未导致)引用错误无关。(虽然
未定义的
值不是很有用,但它只会暴露额外的问题)。很抱歉,原始代码不会创建正确的值,因为该窗口。页面设置了void方法的“return”,因此它是一种相关的:)此答案仍然无法解决[initial]参考错误和第一段使问题听起来像是关于范围;事实并非如此。它是关于执行顺序的。此外,没有返回值的函数的结果是
未定义的
(将计算为该值的一个表达式是
void(…)
,但该计算的值不是“void”)。