2012-06-22 28 views
2

对于这段代码:JavaScript变量意外未定义

if(!skipit) 
    { 
    var update_argument=''; 
    if (document.formname.fieldname) 
     { 
     update_argument=document.formname.fieldname[document.formname.fieldname.selectedIndex].value; 
     } 
    window.setTimeout('updatepcols(update_argument)',250); 
     return false; 
    } 

我得到一个错误,在我的setTimeout称之为“update_argument”是不确定的。当我将其中的空字符串值从“var”分配给“window”时,错误消失,代码正常工作。我猜想这里有一个范围问题,但我不遵循它。为什么update_argument在这种情况下是未定义的,但将其放入窗口对象中让我使用它? (updatepcols是更新定价列的功能。)

回答

4

请尝试此操作。以这种方式使用closure保留参考update_argument

setTimeout(function(){ 
    updatepcols(update_argument); 
},250); 

我有一种奇怪的感觉,你为文本,计算时通过脚本,执行在全球范围内,即在局部范围中update_argument是外声明。

setTimeout('updatepcols(update_argument)',250); 
+1

你可能会解释为什么这个工作。 – jfriend00

+1

这是有效的,因为当你将一个字符串传递给'setTimeout'时,它在全局范围内是'eval'd。当你传递一个函数时,它可以读取局部变量。 –

+1

P.S.总是将函数传递给'setTimeout'是个好习惯。切勿传递字符串。 –

1

我不知道这是否是一个范围的问题或没有,但改变你setTimeout调用应该做的伎俩:

window.setTimeout('updatepcols('+update_argument+')',250); 

这拨弄表明:http://jsfiddle.net/mLrqZ/

+0

功能,但促进一个坏的,有潜在危险的做法... – canon

+0

我upvoted因为这是我的问题的直接答案,但我会接受一个不同的,因为它教导更好的方式。 – TecBrat

0

改变你的表达。应该这样写,如果你要在本地变量传递给你的回调函数:

window.setTimeout('updatepcols('+update_argument+')', 250); 

,或者如果你想使用闭包代替,那么这样做:

window.setTimeout(function(){ updatepcols(update_argument) }, 250); 

呀,像另一些人说,使用封闭是更好的做法。