2011-08-10 1 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()이 옳다고 말합니다.setInterval이 작동하지 않습니까? 무슨 잘못</p> <blockquote> <p>Uncaught ReferenceError: until is not defined (anonymous function)</p> </blockquote> <p>내가 볼 수 없습니다 :이 실행

+3

'updateTime()'함수는 전달하려는'setInterval'에서 아직 매개 변수를 취하지 않습니다. 그 특정 오류에 대한 이유가되지 않을 수도 있지만 여전히 수정해야합니다. – MrMisterMan

+0

나는 이것을 정확히 맹세한다. 어떤 방법 으로든 이것은 닫기입니다. http : // stackoverflow.com/questions/5766285/setinterval-and-function –

답변

15

클로저 :

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

많이 고마워요. D – Mobilpadde

+0

오, 세상에, 내 발표에서 1 시간 거리에있는 광기에서 나를 구해 줬어. 형제, 건배! :) – KevinIsNowOnline

0

당신은 평가의 한 형태를 사용하고 있습니다. 사용 :

setInterval(updateTime,1000); 
5

문제는 코드로 setInterval을 문자열로 전달한다는 것입니다. 즉, 글로벌 범위에서 평가됩니다. 변수 until은 전역 범위에 정의 된 범위에서만 존재합니다. 당신이 함수를 전달하면

,이 (그것의 "폐쇄") 변수 until를 사용할 수 있음을 의미합니다 :

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

논리적 설명이 변수 until 전역 변수 아니라고 할 것이다. 전역 적이 지 않은 (또는 관련 함수 클로저에서 캡처 된) 경우 setInterval이 발생하고 함수 호출로 전달한 문자열을 평가하려고 시도하더라도 여전히 존재하지 않습니다. setInterval에 문자열을 전달하는 것도 좋지 않습니다. 실제 자바 스크립트 함수를 전달해야합니다.

코드를 변경하는 방법은 interval 함수가 호출 될 때마다 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() 함수의 선언과 일치하는 updateTime(until)의 호출을 만들었습니다.

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); 

주 : 이것은 가정하다 변화 매초까지; 그렇지 않으면, 나는 당신이 왜 간격을 가질 것인지 확신하지 못합니다.

관련 문제