2011-07-30 33 views

回答

5

这是一个经常遇到的问题的jsfiddle的 'JavaScript部分' 的用户。你看,这是投入在你的第二个例子作为load处理函数内包裹着,所以“JavaScript部分”的代码,实际输出结果是这样的:

<script type='text/javascript'> 
    //<![CDATA[ 
    $(window).load(function(){ 
    var seconds = 0; 

function timedCount() { 
    $("#txt").val(seconds); 
    seconds += 1; 
    setTimeout("timedCount()",1000); 
} 
    }); 
    //]]> 
    </script> 

现在,timedCount不一个全局函数,因为它仅在load处理程序的范围内可用,并且当您将setTimeout与一串代码一起使用时,将从全局范围进行评估。

方法来解决这个问题包括:

变化setTimeout调用setTimeout(timedCount, 1000);

这个做什么,是通过实际的函数对象setTimeout。而不是从全局范围评估代码串,每次都基本上保留了调用函数的能力,因为范围已经不再重要了 - 您将函数交给setTimeout

var seconds = 0; 

function timedCount() { 
    $("#txt").val(seconds); 
    seconds += 1; 
    setTimeout(timedCount,1000); 
} 

使timedCount使用timedCount = function() { ... };

这反而令timedCount一个全球性的,所以,当setTimeout试图从全球范围内评估timedCount();,它成功是有timedCount功能在全局函数全球范围。

var seconds = 0; 

timedCount = function() { 
    $("#txt").val(seconds); 
    seconds += 1; 
    setTimeout("timedCount();",1000); 
}