无法通过窗口对象访问全局变量 - 间歇性地(?!)

时间:2014-01-13 17:00:14

标签: javascript jquery global-variables window-object

我有两个页面,两个页面都有相似的结构 - 带有id标签的表格,如下所示

<TABLE id="assetsTable1" width="100%" class="tableWrapDataClass"> ...

<table id="vocationalRevenueTable" class="revenue" width="100%"> ...

两个页面都使用几乎相同的javascript代码。但是全局变量的值在第2页上表现不同!

以下是第1页的摘录;

<script type="text/javascript" src="templates/footer.js"></script>
<script type="text/javascript" src="script/jquery-1.8.1.js"></script>
<script type="text/javascript" src="script/scripts.js"></script>
<script>
                $(document).ready(function() {
                    var assetsTable1 = $('#assetsTable1');
                    var assetsTable2 = $('#assetsTable2');
                    var liabilitiesTable1 = $('#liabilitiesTable1');
                    var liabilitiesTable2 = $('#liabilitiesTable2');
                    var shareholderTable = $('#shareholderTable');

                    // note not all subtotals are shown
                    $("#A2Row1").hide();
                    $("#A2Row2").hide();
                    $("#L2Row1").hide();
                    $("#L2Row2").hide();
                    console.log(window.assetsTable1);
                });
                // etc

和第2页,

<script type="text/javascript" src="templates/footer.js"></script>
<script type="text/javascript" src="script/jquery-1.8.1.js"></script>
<script type="text/javascript" src="script/scripts.js"></script>
<script>
                $(document).ready(function() {
                    var vocRevTableRef = $('#vocationalRevenueTable');
                    var nonVocRevTableRef = $('#nonVocationalRevenueTable');
                    var otherRevTableRef = $('#otherRevenueTable');

                    // note not all subtotals are shown initially
                    $("#vocationalRevenueTableSub").hide();
                    $("#nonVocationalRevenueTableSub").hide();
                    $("#otherRevenueTableSub").hide();
                    console.log(window.vocRevTableRef);
                });
                // etc

在Firebug中,第1页上的console.log()调用非常合理地显示

<table id="assetsTable1" class="tableWrapDataClass" width="100%">

然而,在第2页上,它返回

undefined

但是如果我修改两个页面上的console.log()调用来删除'window'。比特,例如;

console.log(assetsTable1);

console.log(vocRevTableRef);

事情回归理智。在这两种情况下,Firebug都会显示对象

Object[table#vocRevTableRef.tableWrapDataClass]

Object[table#assetsTable1.tableWrapDataClass]

窗口对象正在发生一些事情。当然这真是令人抓狂。我可能会错过什么?我应该寻找什么来调试这个? (HTML似乎没有格式错误。)我只是试图将有问题的对象引用传递给一个函数,该函数将行从thePassedReference.tbodies中拉出并对它们求和,但当然它因为神秘而失败了。传递未定义的值。 HALP!感谢。

3 个答案:

答案 0 :(得分:0)

这两个变量都不是全局的,第一个例子是有效的,因为浏览器允许通过它们的ID a'window.IdOfAnElement访问元素(示例1中元素的id等于变量名)。

注意:console.log显示DOMNode的标记,当它显示变量的内容时,结果将是jQuery对象,而不是DOMNode

答案 1 :(得分:0)

var vocRevTableRef不是全局变量 - 删除'var',它将成为一个变量。当然,你的其他应有的全局变量也是如此。第二个示例中的Console.log不起作用,因为隐藏的元素$("#vocationalRevenueTableSub").hide();变得无法访问。

答案 2 :(得分:0)

在第一页上,您可以访问window.assetsTable1,因为您的元素为id="assetsTable1"。这不是因为您的变量(声明为var,因此不是全局)

在第二页上,没有id="vocRevTableRef"的元素,也没有名称为vocRevTableRef的全局变量。因此它给出了undefined