我正在嘗試構建計時器。請比較這兩種情況(第一個作品,而不是第二):內聯和非內聯JavaScript之間的不同行爲
- 聯JavaScript http://jsfiddle.net/x7xhA/
- 非內嵌的JavaScript http://jsfiddle.net/x7xhA/1/
問題是什麼?
我正在嘗試構建計時器。請比較這兩種情況(第一個作品,而不是第二):內聯和非內聯JavaScript之間的不同行爲
問題是什麼?
這是一個經常遇到的問題的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);
}
第二個函數包裝timedCount
函數在jQuery ready
函數中,因此在全局範圍內不可用。
不知道您在尋找詳細的解釋! – Mrchief