JavaScript范围错误,变量未定义

时间:2011-12-13 11:15:47

标签: javascript scope

请看这段代码:

<script>
var mygrid;
function lock(){
    for (var i=1; i<15; i++)
    {
        var cur_row=i + "";
            mygrid.lockRow(cur_row,true);
            mygrid.setRowColor(i,"#E5E5E5");
    }
}
function doInitGrid(){
mygrid = new SomeClass;
}
</script>
</head>
<body onload="doInitGrid()" dir=rtl>
<div id="mygrid_container" style="width:905px;height:550px;"></div>
<script>lock();</script>
  <button onclick="addRow()">Add Row</button>  
  <button onclick="removeRow()">Remove Row</button>
  <button onclick="lock()">lock Row</button>
</body>

为什么当我运行锁定功能时(没有按钮),我的var是未定义的,当我点击按钮时一切正常?

6 个答案:

答案 0 :(得分:2)

这是一个时间问题,而不是范围问题。

您只调用doInitGrid() onload,因此在文档加载完成之前,它不会为mygrid分配值。

当你内联lock()时,你会在加载的情况下这样做

据推测,在点击按钮之前,您已等待文档完成加载。

答案 1 :(得分:0)

如果“我的var未定义”,则表示变量mygrid未定义,这是因为您在函数doInitGrid()内初始化它,直到页面加载时才调用它。 onload事件在整个页面加载完成后发生。其他内联脚本在浏览器在解析文档时遇到它时运行。

答案 2 :(得分:0)

Quentin已经回答了你的问题,但我想补充一点,最好是稍微清理你的代码。这样的事情。

<script>

function lock(mygrid){ //pass in the grid var
    for (var i=1; i<15; i++)
    {
        var cur_row=i + "";
            mygrid.lockRow(cur_row,true);
            mygrid.setRowColor(i,"#E5E5E5");
    }
}

function getInitGrid(){
   //some initialization code here maybe. Otherwise just take this out
   return new SomeClass;//return an instance
}

var mygrid = getInitGrid();

//and then pass in the mygrid variable wherever you call lock

lock(mygrid);
</script>

答案 3 :(得分:0)

我不确定你在没有点击按钮的情况下调用了锁定功能。但是,执行锁定功能时,似乎没有执行doInitGrid函数。以下代码可能有效

function lock(){ 
    if(!mygrid){
      doInitGrid();
    }
    for (var i=1; i<15; i++) 
    { 
        var cur_row=i + ""; 
        mygrid.lockRow(cur_row,true); 
        mygrid.setRowColor(i,"#E5E5E5"); 
    } 
} 

答案 4 :(得分:0)

在文档完全加载之前,您正在调用load()。因此,您的变量未分配,因为尚未调用doInitgrid。(只有在文档完全加载后才会调用它)

答案 5 :(得分:0)

您正在函数mygrid中实例化doInitGrid(),该函数仅在onload上调用。但是您的脚本语句<script>lock();</script>在页面加载之前执行,因为它是页面HTML的一部分。执行此脚本块时,mygrid的值为undefined,这是JS为没有初始值声明的所有变量设置的默认值。

如果你想在页面加载时调用lock(),请在调用doInitGrid()之后在onload上调用它,如下所示:

<body onload="doInitGrid(); lock();" dir=rtl>