2011-11-11 8 views
2

저는이 문제에 정말로 어려움을 겪고 있습니다. 당신이, 내가 카운트 다운 기능을 contsruct하기 위해 노력하고있어 볼 수 있듯이자바 스크립트에서 함수를 인수로 전달합니다.

function webcamupdate(webcamurl) { 
    alert("I am a function to update the webcam with the url "+webcamurl); 
} 

function countdown(callback) { 
    alert(callback); 
    setTimeout("callback()", 10000); 
} 

var theurl = "THIS IS THE URL"; 

countdown(function(){ webcamupdate(theurl); }); 

(더 코드가,하지만 난 그냥 기본을 게시 한) 함수를 실행합니다 (-이 : 여기

코드입니다 10 초 후 웹캠 업데이트). 함수가 다음 coundown 함수의 인수, 그러나 알림 (콜백)이없는 반환하는 경우

모든 확인을 작동합니다 -

기능() {webcamupdate (theurl); }

물론 "webcamurl"이 정의되지 않았으므로 webcamupdate 기능이 실행될 때 스크립트가 충돌합니다. (콜백) 실제로 말을 할 필요가

무엇 경고는 다음과 같습니다 -

기능() {webcamupdate ("이것은 URL입니다"); }

즉, 함수를 전달하기 전에 인수 "theurl"을 평가합니다.

모든 아이디어를 많이

편집을 감상 할 수있다

나는 아마도 당신이 내 오히려 기능보다 경고를 사용하여 속일 것 같아 (난 그냥 간단하게하려고 노력했다!)

다음은 원래 코드입니다 (여전히 줄이거 나 더 나은 아이디어를 제공합니다). 카운트 다운을 표시, 초 DOM 요소를 카운트 다운 시간 및 기능은 제한 시간에 실행 - 그것은 3 개 인수를 -

function webcamupdate(url) { 
    document.getElementById("cruisecam").src=url+"&rand="+Math.random(); 
    countdown(30,"Webcam",function(){ webcamupdate(url); }); 
} 

function countdown(currentcount,displayelement,callback) { 
    var displaytext; 
    if (currentcount == 0) displaytext = displayelement+" is refreshing now"; 
    else displaytext = displayelement+" updating in "+currentcount+" seconds"; 
    if (trackingcountdown.hasChildNodes()) clearelement("trackingcountdown"); 
    trackingcountdown.appendChild(document.createTextNode(displaytext)); 
    if (currentcount == 0) { 
     countdown(currentcount,displayelement,callback) 
    } 
    else { 
     currentcount--; 
     var countdownparameters=currentcount+',"'+displayelement+'",'+callback; 
     setTimeout("countdown("+countdownparameters+")", 1000); 
    } 
} 

//The function is called on window loading with 
//countdown(30,"Webcam",function(){ webcamupdate(url); }); 

//clearelement is another function (not listed) that clears the node. 

기본적으로, 중요한 카운트 다운 기능입니다.

세 번째 인수 (함수)에 자체의 인수가없는 경우 - 예 : webcam() - 잘 작동하지만 웹캠 ("webcampic.jpg")을 추가하려고하면 웹캠 ("webcampic.jpg") 대신 웹캠 (url)을 실행하려고하는 기능 때문에 작동하지 않습니다.

분명히 가장 쉬운 해결책은 url을 전역 변수로 만드는 것입니다. 그러나 이것은 좋은 습관이 아니며 js 파일을 통해 다른 페이지에서 카운트 다운 코드를 사용하는 것을 막을 수 있습니다. 도움!

+0

"실제로 어떤 경고 (콜백)가 필요한가 ..."JavaScript가 작동하는 방식이 아닙니다. – zzzzBov

+0

그러면 모든 것이 끝나고 끝날 때 경고가 무엇을 말해야합니까? – arb

답변

3

callback()에서 함수 참조를 전달하면됩니다.

function webcamupdate(webcamurl) { 
    alert("I am a function to update the webcam with the url "+webcamurl); 
} 

function countdown(callback) { 
    alert(callback); 
    setTimeout(callback, 10000); 
} 

var theurl = "THIS IS THE URL"; 

countdown(function(){ webcamupdate(theurl); }); 
0
var theURL = "THIS IS THE URL"; 

function webCamUrlUpdate(url) { 
    alert("I am a function to update the webcam with the url " + url); 
} 

function countDown(callback) { 
    setTimeout(callback, 10000); 
    alert(callback); 
} 

countDown(function() { 
    /* IMPORTANT: need to return that other function */ 
    return webCamUrlUpdate(theURL); 
}); 

당신은 실제로 예상대로 setTimeout(callback, 10000); 동작합니다 있도록 기능을 반환 할 것입니다. Javascript에서 함수를 경고 할 때 함수 머리글과 본문의 전체 문자열 버전을 얻으려면 alert(callback.toString())과 같습니다.당신이 setTimeout() 전에 콜백을 경고하는 경우 콜백 이제까지 발사처럼

http://jsfiddle.net/btleffler/xJ5uw/

는 흥미롭게도, 그것은 보이지 않는다. 타임 아웃을 설정 한 후 첫 번째 경고를 주석 처리하거나 경고를 보내면 잘 작동합니다. Chrome에서만 테스트 했으므로 더 많은 연구를해야합니다.

어느 쪽이든, 함수를 실제로 호출하기 전에 함수의 매개 변수를 javascript에서 구문 분석 (또는 처리 또는 기타) 할 수 없습니다. 너는 countDown()에있는 익명 콜백을 독자적으로 url을 경고 할 수 있었다.

+0

고마워요. 주말에 살펴 보겠습니다. 그러나 나는 예제를 단순화 시켰고 당신을 그릇 인도 할 수 있다고 생각합니다 - 더 자세히 설명하기 위해 코드를 조금 더 추가 할 수 있는지 알아 보겠습니다. – Clive

0

여러분, 이제 마침내 해결했습니다. 다른 사람들을위한 해결책입니다.

webcamupdatefunction = createfunctionwebcamupdate(url); 

그런 다음 콜백 함수로 새로운 변수를 참조 :이 호출 될 때

function createfunctionwebcamupdate(url) { 
    return function(){ webcamupdate(url); }; 
} 

가 그런 기능을 발사 변수를 설정합니다

먼저 함수를 반환하는 함수를 만들 :

function(){ webcamupdatefunction(); } 

자바는 분명히에 저장된 변수를 기억합니다.변수가 호출 될 때 부분.

희망이 도움이됩니다.

관련 문제