5

次のコードは、HeadFirstjQueryという本に記載されています。

function lightning_one(t) {
$("#lightning1").fadeIn(250).fadeOut(250);
setTimeout("lightning_one()", t);
}; // end lightning_one

この行で呼び出されます。

lightning_one(3000);

観察された動作は、稲妻が1回フェードインおよびフェードアウトし、3秒間待機し、再びフェードインおよびフェードアウトしてから、フェードインおよびフェードアウトを続けることです。Firebugはjavascriptエラーを表示しません。

私は自分が見ているものを見る理由を理解しています。3秒間隔を維持しようと思ったので、これを変更しました。

setTimeout("lightning_one()", t);  // nothing in the brackets

これに:

setTimeout("lightning_one(t)", t);  // t is in the brackets

ページを更新すると、稲妻が1回フェードインおよびフェードアウトします。Firebugは、変数tが未定義であることを教えてくれます。

私の質問は、変数tが変更後に定義されていない場合、変更する前にコマンドをエラーなしでどのように実行したかということです。それはまだtという名前の変数を持っています。

より詳しい情報

コメントと回答を書いてくださった皆様、ありがとうございました。記録として、「end」フォルダのコードは次のようになります。

    lightning_one();

   function lightning_one(){
$("#container #lightning1").fadeIn(250).fadeOut(250);
setTimeout("lightning_one()",4000);
    };

該当する章をまだ終えていないので、後でコードの変更が提案されるかどうかはわかりません。先に述べたように、これは世の中で最高の本ではないかもしれません。しかし、それは私が購入したものであり、それからjQueryの基礎を学んでいます。

4

2 に答える 2

6

setTimeout文字列としての最初の引数はeval-edであるため、t定義されていない関数の外部スコープを調べます。最初の方法は、呼び出しで変数を使用しないため問題ありませんが、2番目の方法はt、関数のスコープ外で定義されていないため問題ありません。それは実際にはローカルです。

アドバイス:まったく使用しないでくださいeval。実際、文字列引数は必要ありません。関数式を使用します。

setTimeout(function() {

    lightning_one(t);

}, t);
于 2012-12-12T00:07:37.483 に答える
2

これ機能します:

setTimeout(function () { lightning_one(t); }, t); 

文字列から関数を呼び出す(そしてそれを評価させる)ことは、避けるべき悪い習慣であると私は確信しています。

于 2012-12-12T00:09:30.147 に答える