2011-11-11 25 views
2

私は本当にこの問題に苦しんでいます。Javascriptの引数として関数を渡します。

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

あなたが見ることができるように、私はカウントダウン機能をcontsructしようとしている(多くのコードがある、しかし私は基本的にちょうど掲示している)機能を実行します( - :

ここではコードですこの場合はウェブカメラを更新します)。関数は、次のcoundown関数の引数は、しかし警告(コールバック)を持っていない返す場合

すべてがOKに動作します -

機能(){webcamupdate(theurl)。 }

"webcamurl"が定義されていないため、webcamupdate関数が実行されたときにこのスクリプトはクラッシュします。実際に言う必要がどのような警告(コールバック)

は次のとおりです。 -

機能(){webcamupdate( "THIS ISは、URL"); }

つまり、関数で渡す前に引数 "theurl"を評価します。

任意のアイデアがはるかに

EDIT

をいただければ幸い私は、私は多分あなたは私のアラートではなく、機能を使用して誤解したと思う(私はちょうどそれをシンプルに保つためにしようとしていた!)

元のコードは次のとおりです(まだ切り詰められていますが、より良いアイデアが得られます)。カウントダウンを表示するには、秒単位で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. 

基本的に、それは重要なカウントダウン機能です。

第3引数(関数)に独自の引数がない場合(例: webcam() - うまくいきますが、webcam( "webcampic.jpg")を追加しようとすると、webcam( "webcampic.jpg")ではなくwebcam(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())と同じです。興味深いことに

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

あなたがsetTimeout()前にコールバックを警告する場合、コールバックは、これまで発射するように、それはいないようです。タイムアウトを設定した後で、最初のアラートをコメントアウトするか、警告を発すると、正常に動作します。私はChromeでテストしただけなので、私が想定しているより多くの研究をしなければなりません。

いずれにしても、関数が実際に呼び出される前に、関数のパラメータをJavaScriptで解析する(または処理するなど)ことはできません。 countDown()で匿名のコールバックを持つだけで、URL自体に警告することができます。

+0

ありがとうございます - 私は週末にそれを見てみましょう。しかし、私は例を単純化しすぎてあなたを欺いてしまったかもしれないと思います - 私はもう少し詳しく説明するコードを追加できますか? – Clive

0

私は最後にそれを解決しました。ここでは他の人のための解決策です。

webcamupdatefunction = createfunctionwebcamupdate(url); 

はその後、コールバック関数として、この新しい変数を参照してください。呼び出されたときに

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

は次に機能を発射する変数を設定します。

まず関数を返す関数を作成:

function(){ webcamupdatefunction(); } 

JavaScriptは明らかにに格納された変数を覚えているようですは、変数が呼び出されたときの部分です。

これが役に立ちます。

関連する問題