2011-08-10 7 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); 

毎回、私はこのエラーを取得します。私はGoogleに多くのことを試みましたが、私が見つけたすべてのページは、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

あなたはevalの形式を使用しています。使用:

setInterval(updateTime,1000); 
5

問題は、文字列としてsetIntervalにコードを渡していることです。つまり、グローバルスコープで評価されます。変数untilはグローバルスコープ内には存在せず、定義されているスコープ内にのみ存在します。

あなたがで関数を渡すと、これは変数untilは(それの「閉鎖中」)が利用可能であることを意味します

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

論理的な説明は、変数untilがグローバル変数ではないということでしょう。グローバルでない(または関連する関数クロージャで捕捉されていない)場合は、setIntervalが起動して関数呼び出しとして渡された文字列を評価しようとします。また、文字列をsetIntervalに渡すのは良い方法ではなく、実際のjavascript関数を渡す必要があります。

どのようにコードを変更する必要があるかは、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にはグローバルスコープがあります。そのため、グローバルスコープで定義されていないと思います。コードを次の2つに変更すると動作します。私はこれがあなたがやろうとしていることだと信じています。

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

注:これは毎秒変わるまでと仮定しています。そうでなければ、私はあなたがなぜ間隔を持つのか分からない。

関連する問題

 関連する問題