2011-12-13 55 views
0

请看看这段代码:JavaScript的范围错误,变量未定义

<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是不确定的,而当我点击按钮,一切都还好吗?

+0

什么是你的问题? – Max

回答

2

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

您只需拨打doInitGrid()onload,直到文档加载完成后才会将值赋予mygrid

当您拨打lock()联机时,您会这样做作为文档加载

大概你已经等到文档完成加载后再点击按钮。

+0

那么如何在正确的时机调用锁定?有没有解决方法? – Gabi

+0

在onload事件处理程序中进行赋值之后立即进行调用。 – Quentin

+0

但我有一个问题,只有在我呼吁

我可以做一个锁,所以我需要的功能被称为后div存在.. – Gabi

0

如果通过“我的变量未定义”,表示变量mygrid未定义,这是因为您将它初始化为函数doInitGrid(),该函数在页面的onload之前不会被调用。 onload事件发生在整个页面加载完成后。当浏览器在解析文档时遇到其他内联脚本。

0

昆汀已经回答了您的问题,但我想补充一点,清理您的代码会更好。像这样的东西。

<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> 
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"); 
    } 
} 
0

面前的这份文件被完全加载要调用load()下面的代码可以正常工作。所以,你的变量没有被指定为doInitgrid尚未调用。(它被称为文档满载后,才)

0

您实例mygrid功能doInitGrid()被称为只在里面的onload。但是您的脚本语句<script>lock();</script>在页面加载之前执行,因为它是页面HTML的一部分。执行此脚本块时,mygrid的值为undefined,这是JS为所有声明的初始值设置的默认值。

如果你想调用锁()时,页面加载,调用它的onload调用doInitGrid(后)是这样的:

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

但我有一个问题,只有在我呼吁

我可以做一个锁,所以我需要在div存在后调用该函数。 – Gabi

+0

只有在加载了HTML中的所有元素后,才会触发加载。所以在你的onload中调用lock()是安全的,因为你提到的div保证当时被加载。 – techfoobar