2013-06-24 53 views
5

JS-lintが 'factorial'が定義される前に使用されていると不平を言わないように、Javascriptでお互いを呼び出す関数のペアをどのように定義できますか?JavaScript関数間の循環参照

function factorial1(n) { return factorial(n); } 
function factorial(n) { return n === 0 ? 1 : n * factorial1(n - 1); } 

JSlintを満たす有効な注文がないようです。 (一方はもう一方に埋め込むことができますが、これはお互いに呼び出す関数の集まりにとっては悪夢です)。

確かにこれは言語の権利によって処理されますか? これはJSlintのバグですか? (この質問はどこかで答えたはずですが、見つけられません)

+0

おそらく 'n === 0? 1:... '。また、何が動作しないのですか(私がすでに指摘した論理的なエラーを除く)? – Dogbert

+0

>>これは確かに言語の権利によって処理されますか? 通常、ページが応答しなくなり、ブラウザがポップアップアラートを表示してスクリプトを停止するか、続行するかを尋ねます。 – mohkhan

+0

@dobertはい、あなたの編集は正しいです。実際の問題は、JSlintは定義される前に '階乗'が参照されていると不平を言うことです。 –

答えて

6

関数内の参照は、実行されるまで解決されません。どちらかの関数が実行されるまでに両方の関数が定義されている限り、それらはお互いを見つけるでしょう。

あなたはJSLintの警告を取り除きたい場合は、あなただけの前に、関数の名前を定義することができます。私は関数にこの構文を好む

var factorial; 
function factorial1(n) { return factorial(n); } 
function factorial(n) { return n === 0 ? 1 : n * factorial1(n - 1); } 
+0

申し訳ありませんが、私はJSリントが不平を言っているということを明確にしていません。 –

+0

ありがとう!もちろん。私はvar関数で指定された関数との混合を考慮しませんでした! –

0

var factorial1 = function(n) { return factorial(n); } 
var factorial = function(n) { return n === 0 ? 1 : n * factorial1(n - 1); } 

はありませんがこの構文で関数を宣言することを忘れることができます。

+0

すべてのステートメントは、セミコロンで終了する必要があります。ここでは大したことではありませんが、これらのステートメントをコピーして貼り付けると問題が発生する可能性があります。 –

関連する問題