1

2秒ごとにポップアップで「こんにちは、ようこそ」というテキストを警告するタイマー機能があります。また、10秒でポップアップを停止するようにタイマー間隔をクリアする機能があります。

clearInterval関数行を次のように使用すると、表示されるポップアップボックスが停止します

setTimeout(function() {clearInterval(x); },10000);

しかし、settimeout関数を次のように使用すると、ポップアップボックスの表示が停止しません

setTimeout("clearInterval(x);",10000);

ただし、組み込み関数を次のように直接定義することにより、 settimeout 関数を使用してポップアップを表示する場合 setTimeout("alert('hello, welcome');",2000); // works properly

上記の 2 行で settimeout 関数の動作が異なる理由を説明してください。以下の私のコードを見つけてください。

<html>
<head>
<script type='text/javascript' >
function testclear()
{
    var x = setInterval("alert('hello, welcome');",2000);
    setTimeout(function() { clearInterval(x); },10000);

   // setTimeout("clearInterval(x);",10000);
}
</script>
</head>
<body>
    <input id='txt' onchange='testclear()' />
</body>
</html>
4

4 に答える 4

3

しかし、settimeout関数を次のように使用すると、ポップアップボックスの表示が停止しません

setTimeout("clearInterval(x);",10000);

これは、その文字列を評価するときに、変数「x」が適切にキャプチャされていないためです。おそらくwindow.x(インターバルタイマーIDを保持するローカル変数ではなく)を指します。

作業例のクロージャーは適切なx.

避けるべきもう 1 つの理由eval

アラートは変数を参照しないため、この問題は (まだ) 発生していませんが、クロージャー (「関数」) 形式に変更することもお勧めします。

于 2013-01-24T07:22:03.803 に答える
1

setIntervalorの最初のパラメーターに文字列を指定すると、特定の時間/間隔でsetTimeout実行されると思います。evalそのため、グローバル スコープで実行されます。あなたの場合、グローバルスコープでは利用できません...それは関数x内でスコープ化されたローカル変数です。testclear最初のパラメーターとして関数を渡すsetIntervalか、最初setTimeoutに作業していたスコープ (testclear関数内) を保護します。

あるいは、好ましくはありませんが、これを行うことができると思います:

setTimeout("clearInterval(" + x + ");",10000);

ただし、この連結は、他の状況 (他のメソッド呼び出し) では異なるか、不可能である可能性があることに注意してください。

于 2013-01-24T07:22:35.947 に答える
0

これxは、 が function に対してローカルであるためですtestclear()。関数を setTimeout に渡すと、それが記述されたものと同じスコープを取得するため、x認識されます。

文字列リテラルを渡すと評価されますが、スコープは失われます。

グローバル変数の場合も「機能」xしますが、お勧めできません。

于 2013-01-24T07:22:34.610 に答える
-1

動作例ここで 、コードをカスタマイズしましたが、正常に動作します。

  1. x 変数をグローバルにします。
  2. var t= setTimeout(' clearInterval(x);' ,1501);setTimeout をキャッチするように一時変数を設定します。従うべきセマンティクスです。
于 2013-01-24T08:07:39.627 に答える