访问全局javascript变量时出现问题

时间:2009-10-21 09:35:40

标签: javascript jquery window global

我的应用程序有类似以下结构

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窗口时也是如此..object1的定义与我预期的完全相同

我尝试过如上所述但是使用简单的全局变量(即var object1而不是window.object1)...尝试在各个地方声明object1和object2的初始虚拟值...但是反对一样的问题。

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

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

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

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

答案 2 :(得分: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;
}