10秒ごとにjavascript関数を実行する必要があります。
私は構文が次のように機能する必要があることを理解していますが、成功していません:
function funcName() {
alert("test");
}
var func = funcName();
var run = setInterval("func",10000)
しかし、これは機能していません。助けがありますか?
他の多くの答えは、機能するパターンに焦点を当てていますが、その説明は、現在のコードが機能しない理由についてはあまり徹底的ではありません。
参照用のコード:
_function funcName() {
alert("test");
}
var func = funcName();
var run = setInterval("func",10000)
_
これをチャンクに分割しましょう。関数funcName
は問題ありません。 funcName
を呼び出す(つまり、実行する)ときは、_"test"
_に警告することに注意してください。ただし、funcName()
-括弧は関数を「呼び出す」または「実行する」ことを意味しますが、実際には値を返しません。関数に戻り値がない場合、デフォルトはundefined
として知られる値になります。
関数を呼び出すとき、引数リストを括弧内の最後に追加します。関数を渡す引数がない場合は、funcName()
のような空の括弧を追加するだけです。ただし、関数自体を参照し、呼び出したくない場合は、括弧がそれを実行することを示すため、括弧は必要ありません。
だから、あなたが言うとき:
_var func = funcName();
_
実際には、funcName()
の値を持つ変数func
を宣言しています。ただし、括弧に注意してください。 funcName()
は、実際にはfuncName
の戻り値です。上で述べたように、funcName
は実際には値を返さないため、デフォルトではundefined
になります。つまり、言い換えると、変数func
の値は実際にはundefined
になります。
次に、この行があります:
_var run = setInterval("func",10000)
_
関数setInterval
は2つの引数を取ります。 1つ目は頻繁に実行される関数で、2つ目は関数が実行される間のミリ秒数です。
ただし、最初の引数は実際には文字列ではなく関数でなければなりません。文字列の場合、JavaScriptエンジンはその文字列でeval
を代わりに使用します。つまり、言い換えると、setIntervalは次のJavaScriptコードを実行しています。
_func
// 10 seconds later....
func
// and so on
_
ただし、func
は単なる変数です(値はundefined
ですが、それは無関係です)。そのため、JSエンジンは10秒ごとに変数func
を評価し、undefined
を返します。しかし、これは実際には何もしません。つまり、技術的には10秒ごとに評価されていますが、その効果は見られません。
解決策は、setInterval
に文字列の代わりに実行する関数を与えることです。したがって、この場合:
_var run = setInterval(funcName, 10000);
_
func
を付けていないことに注意してください。これは、func
がコード内のnot関数であるためです。 funcName()
を割り当てたため、値はundefined
です。上で言ったように、funcName()
は関数funcName
を呼び出し、関数の戻り値を返します。 funcName
は何も返さないため、デフォルトはundefined
になります。今まで何度か言ったことは知っていますが、それは本当に非常に重要な概念です。funcName()
を見たら、「funcName
の戻り値」を考える必要があります。 関数自体を別のエンティティのように参照する場合は、funcName
を呼び出さないように括弧を省略してください。
したがって、コードの別の解決策は次のとおりです。
_var func = funcName;
var run = setInterval(func, 10000);
_
しかし、それは少し冗長です:なぜfunc
の代わりにfuncName
を使用するのですか?
または、次の2ビットを変更することにより、元のコードを可能な限り忠実に保つことができます。
_var func = funcName;
var run = setInterval("func()", 10000);
_
この場合、JSエンジンはfunc()
を10秒ごとに評価します。つまり、10秒ごとに_"test"
_をアラートします。ただし、有名なフレーズが示すように、 eval
は悪です ですので、可能な限り避けてください。
このコードのもう1つの工夫は、匿名関数を使用することです。言い換えれば、名前のない関数です。名前を気にしないので、コードにドロップするだけです。
_setInterval(function () {
alert("test");
}, 10000);
_
この場合、関数が何と呼ばれるかは気にしないので、そこに汎用の名前のない(匿名の)関数を残します。
setInterval("func",10000)
をsetInterval(funcName, 10000)
またはsetInterval("funcName()",10000)
に変更します。前者が推奨される方法です。
これを試して:
function funcName() {
alert("test");
}
var run = setInterval(funcName, 10000)
これは、文字列ではなく関数を渡す必要があるためです。
_function funcName() {
alert("test");
}
setInterval(funcName, 10000);
_
コードには2つの問題があります。
var func = funcName();
はすぐに関数を呼び出し、戻り値を割り当てます。"func"
_だけは無効です。 evalのような関数を呼び出すのはsetInterval("func()", 10000)
です。