10 秒ごとに JavaScript 関数を実行する必要があります。
構文は次のように機能する必要があることは理解していますが、成功しません。
function funcName() {
alert("test");
}
var func = funcName();
var run = setInterval("func",10000)
しかし、これは機能しません。何か助けはありますか?
ベストアンサー1
他の多くの回答は、実際に機能するパターンに焦点を当てていますが、現在のコードが機能しない理由についての説明はあまり徹底的ではありません。
参考までにあなたのコード:
function funcName() {
alert("test");
}
var func = funcName();
var run = setInterval("func",10000)
これをいくつかの部分に分割してみましょう。関数はfuncName
正常です。 を呼び出すfuncName
(つまり、実行する) と、 が警告されることに注意してください"test"
。ただしfuncName()
、括弧は関数を「呼び出す」または「実行する」ことを意味しますが、実際には値を返さないことに注意してください。関数に戻り値がない場合、 と呼ばれる値がデフォルトで使用されますundefined
。
関数を呼び出すときは、その引数リストを括弧で囲んで末尾に追加します。関数に渡す引数がない場合は、 のように空の括弧を追加するだけですfuncName()
。ただし、関数自体を参照し、呼び出さない場合は、括弧は関数を実行することを示すため、括弧は必要ありません。
ですから、次のように言うと:
var func = funcName();
func
実際には の値を持つ変数を宣言していますfuncName()
。ただし、括弧に注意してください。 はfuncName()
実際には の戻り値ですfuncName
。上で述べたように、 はfuncName
実際には値を返さないため、デフォルトで になりますundefined
。つまり、変数のfunc
実際の値は になりますundefined
。
次に、次の行を作成します。
var run = setInterval("func",10000)
この関数はsetInterval
2 つの引数を取ります。最初の引数は定期的に実行される関数であり、2 番目の引数は関数が実行される間隔 (ミリ秒数) です。
ただし、最初の引数は文字列ではなく関数である必要があります。文字列の場合、JavaScript エンジンはeval
代わりにその文字列を使用します。つまり、setInterval は次の JavaScript コードを実行します。
func
// 10 seconds later....
func
// and so on
ただし、func
は単なる変数です (値は ですundefined
が、これはあまり関係ありません)。したがって、10 秒ごとに、JS エンジンは変数を評価してfunc
を返しますundefined
。しかし、これは実際には何もしません。つまり、技術的には 10 秒ごとに評価されていますが、その効果は見られません。
解決策は、setInterval
文字列の代わりに実行する関数を指定することです。つまり、この場合は次のようになります。
var run = setInterval(funcName, 10000);
私がそれを与えなかったことに注目してくださいfunc
。これfunc
はないコード内の関数。undefined
これは に代入した値 ですfuncName()
。上で述べたように、 は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秒ごとに評価します。言い換えれば、"test"
10秒ごとに警告を発することになります。しかし、有名なフレーズにあるように、eval
悪であるなので、可能な限り避けるようにしてください。
このコードのもう 1 つの工夫は、匿名関数を使用することです。つまり、名前のない関数です。名前が何であってもかまわないので、コード内にそのまま挿入します。
setInterval(function () {
alert("test");
}, 10000);
この場合、関数の名前が何であるかは気にしないので、汎用の名前のない (匿名の) 関数をそのまま残します。