0

我的应用程序具有以下结构

window.object1;
window.object2;
$(document).ready(function() {
   window.object1 = new type1object();
});

function type1object() {
   //lots of code
   this.property = 'property';
   window.object2 = new type2object();
}

function type2object() {
   //lots of code
   this.property = new type3object();
}

function type3object() {
   //lots of code
   console.log(window.object1);
   this.property = window.object1.property;
}

问题是,每当我尝试从文档就绪回调以外的任何地方访问 window.object1 时,它都会返回为未定义,即使当我检查 DOM window.object1 时,它的定义完全符合我的预期。

我尝试过与上面相同的操作,但使用简单的全局变量(即 var object1 而不是 window.object1)...尝试在不同的地方为 object1 和 object2 声明初始虚拟值...但遇到了同样的问题.

有谁知道为什么我不能全局访问我的全局变量?

4

3 回答 3

2

您必须确保在启动 window.object1 后对其进行评估。也就是说,在你的情况下,只有在 document.ready 完成执行之后

如果您查看下面的示例,您可以看到在单击时两者都已初始化。

<html>
    <body>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
    <script>        
        $(document).ready(function() {
           window.object1 = new type1object();
           window.object2 = new type2object();
           //console.log(window.object1);
        });

        $(document).click(function(){
            console.log(window.object1);
            console.log(window.object2);            
        });

        function type1object() {
        }

        function type2object() {
        }

    </script>
于 2009-10-21T09:52:08.950 回答
1

由于在文档就绪函数内部之前您没有设置值,window.object1因此在它运行之前您将无法访问它。

您的代码中没有任何内容表明您不能完全删除该文档就绪调用。它通常保留用于等待元素加载到 dom 中,这看起来不像你正在做的。如果您在不存在的代码中确实有需要等待的元素,只需将您的脚本放在页面底部,就在标签上方。这将相当于准备好文档。

于 2009-10-21T09:42:08.463 回答
1

编写真正剥离的代码使答案消失了-我正在创建在构造object1期间引用object1的东西。

所以我把它改成了这个,以便在任何尝试引用它之前对象就存在(尽管没有内容):

window.object1;
window.object2;
$(document).ready(function() {
   window.object1 = new type1object();
   window.object1.construct();
});

function type1object() {
   //lots of code
   this.construct = function() {
      this.property = 'property';
      window.object2 = new type2object();
   };
}

function type2object() {
   //lots of code
   this.property = new type3object();
}

function type3object() {
   //lots of code
   console.log(window.object1);
   this.property = window.object1.property;
}
于 2009-10-21T17:16:11.500 回答