2011-07-30 27 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); 
}