2012-12-12 9 views
5

次のコードは、Head First jQueryという本にあります。変数が定義されていない場合もあります。

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

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

lightning_one(3000); 

観察された挙動は、雷がフェードインおよびアウト回、3秒間待機し、もう一度とフェードアウトし、その後でとフェードアウトし続けることです。 Firebugはjavascriptエラーを表示しません。

私は何を見るのか理解しています。私は3秒間隔を維持しようとするだろうと思ったので、私は、この変更されました:私はページを更新すると、雷が一度にとフェードアウト

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

:これに

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

を。 Firebugは変数tは未定義であると私に伝えます。

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

はあなたのコメントや答えを書いてみんなに感謝します。コードの変更は、後に提案してしまった場合、私はまだ該当する章を終えていない

lightning_one(); 

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

ので、私にはわからない:記録のために、「終了」フォルダ内に、コードは次のようになり。先に述べたように、これは最高の本ではないかもしれません。しかし、それは私が買ったもので、jQueryの基礎を学んでいます。

+4

実際に文字列を 'setTimeout'に渡しますか?その本を遠くに投げる。 – Bergi

+0

私は同じ考えをしていた:私はこのように機能を呼び出すことは悪い習慣だと思った...本で教えるべきではない何か! – jahroy

+0

私は自分自身で答えを見つけようとしていたときに、その効果について多くの言葉を見ました。引用符をつけずに関数を呼び出すことは私の失敗した努力の1つでした。私の質問の目的のために、私は正確な見積もりが行くための最善の方法だろうと思った。 –

答えて

6

setTimeoutの最初の引数はeval -edです。つまり、tが定義されていない関数の外側の範囲を調べます。最初の1つは、呼び出しで変数を使用しないためですが、tが関数の範囲外で定義されていないため、2番目の呼び出しは無効ではありません。実際にはローカルです。

アドバイス:evalはまったく使用しないでください。実際には、文字列引数は必要ありません。私は文字列から機能を呼び出す(そして、それが評価を取得させること)である必要があり悪い習慣であるかなり確信して

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

setTimeout(function() { 

    lightning_one(t); 

}, t); 
2

このます仕事:関数式を使用します避けてください。

+0

この回答は本当にうまくいきました。 –

関連する問題