2011-08-10 57 views
7
var until = $("#time").html(); 

function updateTime() { 
    $("#time").html(
     date("d", until) + " day(s)<br />" + 
     date("h", until) + " hour(s)<br />" + 
     date("i", until) + " minute(s)<br />" + 
     date("s", until) + " second(s)" 
    ); 
} 

setInterval("updateTime(until)",1000); 

每次我運行它,我得到這個錯誤:setInterval不起作用?

Uncaught ReferenceError: until is not defined (anonymous function)

我看不出什麼錯。我試過很多谷歌,但我發現每一頁都說setInterval()是對的。

+3

你的'updateTime()'函數在你嘗試傳遞''setInterval''的時候還沒有帶任何參數。這可能不是該具體錯誤的原因,但仍需要糾正。 – MrMisterMan

+0

我以完全相同的方式發誓。無論如何,這是關閉的:http:// stackoverflow。com/questions/5766285/setinterval-and-function – 2011-08-10 15:45:35

回答

15

瓶蓋:

setInterval(function() {updateTime(until); }, 1000); 
+0

非常感謝:D – Mobilpadde

+0

哦,我神經兮兮的上帝,因爲我距離我的演講1小時,所以你從瘋狂中拯救了我。乾杯兄弟! :) – KevinIsNowOnline

0

您正在使用eval的形式。使用方法:

setInterval(updateTime,1000); 
5

問題在於您將代碼作爲字符串傳遞給setInterval。這意味着它在全球範圍內進行評估。變量until在全局範圍內不存在,僅在其定義的範圍內。

如果傳遞的功能,這意味着該變量until可用(它的「封閉」):

setInterval(function() { 
    updateTime(until); 
},1000); 
0

邏輯的解釋是變量until不是一個全局變量。如果它不是全局的(或者在相關函數閉包中捕獲),那麼當setInterval觸發並嘗試計算作爲函數調用傳遞的字符串時,它不會存在。將字符串傳遞給setInterval也不是一個好習慣,你應該傳遞一個實際的javascript函數。

至於應該如何更改代碼,取決於是否希望每次調用間隔函數時都要更新until的值,或者是否希望在運行前僅捕獲一次,並將該值用於定時器間隔的所有後續調用。你的代碼對於你希望工作的方式(將其捕獲到一個變量中,然後嘗試每次傳遞它)有點含糊不清。如果你不希望的,直到永遠更新的價值,你可以做這樣的:

var until = $("#time").html(); 

function updateTime(when) { 
    $("#time").html(
     date("d", when) + " day(s)<br />" + 
     date("h", when) + " hour(s)<br />" + 
     date("i", when) + " minute(s)<br />" + 
     date("s", when) + " second(s)" 
    ); 
} 

setInterval(function() {updateTime(until);}, 1000); 

這將捕獲的until範圍的功能關閉,並使其可匿名區間回調函數。把它放入一個像你之前做的字符串不會產生這樣的封閉。

我也叫updateTime(until)匹配你的updateTime()函數的聲明。

0

SetInterval具有全局作用域,所以我猜測直到沒有在全局作用域中定義。將您的代碼更改爲以下兩個將適用。我相信這是你想要做的。

function updateTime(){ 
    var until = $("#time").html(); 
    $("#time").html(
     date("d", until) + " day(s)<br />" + 
     date("h", until) + " hour(s)<br />" + 
     date("i", until) + " minute(s)<br />" + 
     date("s", until) + " second(s)"); 
    } 
setInterval("updateTime()", 1000); 

function updateTime(until){ 
    $("#time").html(
     date("d", until) + " day(s)<br />" + 
     date("h", until) + " hour(s)<br />" + 
     date("i", until) + " minute(s)<br />" + 
     date("s", until) + " second(s)"); 
    } 
setInterval(function() { updateTime($("#time").html()) }, 1000); 

注意:這是假設之前更改每一秒;否則,我不知道爲什麼你會有間隔。