2012-02-28 30 views
0

なぜ私にはエラーがありますか未知のReferenceError:helloは定義されていません?ここで未知のReferenceError:helloが定義されていません

function hello() { 
    console.log('hello()'); 
    setTimeout("hello()", 1000); 
} 
setTimeout("hello()", 1000);​ 

はjsfiddleです:http://jsfiddle.net/s9vLk/

+1

ポストこのサイト上の代わりに、別のサイト上であなたのコード。リンクは補足的でなければなりません。 –

答えて

2

問題は、あなたはそれがで動作していると思うので、あなたは、文字列内のコードが効果的にeval EDになることを意味するsetTimeout()に文字列を渡していることにあるとし、したがって、hello()関数が見つかりません。

左のjsfiddleオプションを "onload"から "no wrap"に変更すると、関数はonloadハンドラの中にネストされているのではなくグローバルになりますが、より良いオプションは関数を渡すことですsetTimeout()への参照:

function hello() { 
    console.log('hello()'); 
    setTimeout(hello, 1000); 
} 
setTimeout(hello, 1000); 

(注:hello後なし括弧)

+0

evalされた文字列と範囲についての最も詳細な回答:-) – Matthew

0

あなたがhello()の間にスペースを持っています。

実際には引数を文字列としてsetTimeoutに渡すべきではありません。

+0

私は持っています:function hello(){...} これは関数ではありませんか? – Matthew

+0

それは決してそれほど遠くにも及ばないので、問題ではありません。 – Petah

+1

このスペースではエラーは発生しません。トークンの間にスペースが表示されても、コードは有効なままです。 –

0

関数名を文字列として参照する必要はありません。

まだ
function hello() { 
    console.log('hello'); 
    setTimeout(hello, 1000); 
} 
setTimeout(hello, 1000); 

またはそれ以上

setInterval(function() { 
    console.log('hello'); 
}, 1000); 
+0

私は、引数setTimeout( 'MyFunction()'、1000)として関数名を持つ文字列を使用する例をたくさん見てきました。 なぜ私にとってはうまくいかないのですか? – Matthew

+0

@Matthewなぜそれがうまくいかないのはダニエルの答えで説明されていますが、私は代わりの方法を述べていました。 – Petah

+0

@Matthew - 文字列を渡すと、コードが実行されるスコープに影響します。 Šimeと私が投稿した答えを見てください。 – nnnnnn

4

あなたのデモ内のJavaScriptコードは、'load'イベントハンドラ( "オンロード" が選択されているオプション)内で実行されます。したがって、関数helloはグローバル関数ではありません。オプションは「ラップ(本文)なし」または「ラップなし(ヘッド)」に設定する必要があります。つまり、JavaScriptコードはグローバルコードになります。

ライブデモ:スコープで実行されていないhttp://jsfiddle.net/s9vLk/1/

関連する問題