web-dev-qa-db-ja.com

Javascript setIntervalが機能しない

10秒ごとにjavascript関数を実行する必要があります。

私は構文が次のように機能する必要があることを理解していますが、成功していません:

function funcName() {
    alert("test");
}

var func = funcName();
var run = setInterval("func",10000)

しかし、これは機能していません。助けがありますか?

25
mauzilla

他の多くの答えは、機能するパターンに焦点を当てていますが、その説明は、現在のコードが機能しない理由についてはあまり徹底的ではありません。

参照用のコード:

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

この場合、関数が何と呼ばれるかは気にしないので、そこに汎用の名前のない(匿名の)関数を残します。

108
Reid

setInterval("func",10000)setInterval(funcName, 10000)またはsetInterval("funcName()",10000)に変更します。前者が推奨される方法です。

6
techfoobar

これを試して:

function funcName() {
    alert("test");
}

var run = setInterval(funcName, 10000)
4
qwertymk

これは、文字列ではなく関数を渡す必要があるためです。

_function funcName() {
    alert("test");
}

setInterval(funcName, 10000);
_

コードには2つの問題があります。

  • var func = funcName();はすぐに関数を呼び出し、戻り値を割り当てます。
  • SetIntervalの不適切で非推奨のevalに似た構文を使用しても、_"func"_だけは無効です。 evalのような関数を呼び出すのはsetInterval("func()", 10000)です。
3
ThiefMaster