2012-05-30 37 views
2

当我尝试运行这个程序,我得到了Firefox的一个错误,指出:无法进行递归调用Javascript中

在MOVEDATE未定义线41

(指线window.setTimeout("moveDate()",100);

为什么?我以为递归函数能够定义自己,然后在他们自己拨打任何想法。

function monthScroller(){ 
    document.getElementById("month").style.visibility = "visible"; 
    var x = 0; 
    var y = 0; 
    var dest_x = window.innerWidth/2; 
    var dest_y = window.innerHeight/2; 
    var interval = 1; 

    function moveDate() { 
     if(x<dest_x){ x = x + interval;} 
     if(y<dest_y){ y = y + interval;} 

     document.getElementById("month").style.top = y+"px"; 
     document.getElementById("month").style.left = x+"px"; 

     if ((x+interval < dest_x) && (y+interval < dest_y)) { 
       window.setTimeout("moveDate()",100); 
     } 
     else{ 
      name(); 
     } 
    } 
    moveDate(); 
} 
+1

eval()是邪恶的。不要使用这些,包括'setTimeout(“”)'中的那个。 –

+0

德里克,你打败我的eval()是邪恶的线。无论如何,这篇博文解释了更多关于你为什么不想使用字符串来动态评估代码的问题(这是setTimeout在使用字符串时的作用)。 http://blogs.msdn.com/b/ericlippert/archive/2003/11/01/53329.aspx –

+3

这不是真正的递归,moveDate()将在你的setTimeout重新运行之前约100ms完成它的调用如果您按照答复者的建议致电。 –

回答

6

是的,他们是。但是,window.setTimeout("moveDate()",100);将在全球范围内评估代码字符串 - 在此处找不到moveDate。取而代之的是,通过该函数参照setTimout()

window.setTimeout(moveDate, 100); 
2

“MOVEDATE” 的monthScroller方法的内部的作用范围。 monthScroller函数括号外的任何内容都看不到“moveDate”函数。所以...当setTimeout运行时,范围“窗口”和窗口在范围内没有名为“moveDate”的函数。你需要做的是改变呼叫以下:

setTimeout(moveDate,100); 

这应该为你工作。这样你将moveDate函数/对象传递给setTimeout。