2012-11-10 11 views
5

何が問題なのか分かりません。最初のコードは正常に動作します関数内のsetIntervalはエラーを生成します。変数が定義されていません

<script language="JavaScript" type="text/javascript"> 
    var count = 0; 
    function countdown() 
    { 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
    } 
    countdown(); 
</script> 



、第二の生成:

<script language="JavaScript" type="text/javascript"> 
    function countdown() 
    { 
    var count = 0; 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
    } 
    countdown(); 
</script> 



サード:
まず::第二

<script language="JavaScript" type="text/javascript"> 
    var count = 0; 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
</script> 



私は3つのコードを持っています"setInterval"行のエラー: "カウントが定義されていません"、3番目のコードは再び正常に動作します。 "count"変数のスコープは、2番目のコードのsetInterval関数ではグローバルでなければなりません。それはなぜですか?私はMozilla Firefoxを使用しています。おかげさまで あなただけに走ったそのうちの一つの理由の多く、決してこれまでについては

+0

setInterval/setTimeoutのコールバックとして文字列を使用しない理由の1つが見つかりました。右の関連する質問を見て、私は彼らの半分は同じ問題を共有すると思います。 – Yoshi

答えて

8

setTimeoutまたはsetIntervalに文字列を渡します。これまで私は真剣です。正当な理由はない。

代わりに関数を渡します。関数オブジェクトを渡す機能は、JSの最も優れた機能です。

var count = 0; 
alert(count); 

var timer = setInterval(function(){ 
    count = count + 1; 
    alert(count); 
}, 10000); 

あなたが直面している問題は、このような文字列としてのコードは範囲を尊重しないことです。グローバルスコープで実行されます。グローバルスコープは、変数が2番目と3番目のスニペットに存在しない場所です。 countは実際にはグローバル変数であるため、最初のスニペットが機能します。

これは、基本的にはevalであり、頭痛を伴い、完全に避けるのが最善の方法です。結局のところEval is Evil

+0

こんにちは、Alex Wayne!助けてくれてありがとう。なぜ文字列が悪いのかまだ分かりませんが、あなたが提供したリンクをたどってみることにします。私が読んだ本では問題が解決されていないのは不思議です。 – GreenBear

+0

要するに、速度が遅く、潜在的に危険な(評価がそうである)ため、期待していないように動作するため、悪いことです。それらのすべては、実際の実際の関数を使用することで解決されます。 –

関連する問題