2011-01-10 11 views
0
function First() { 
setTimeout("Second()", 50) 
}; 

function Second() { //I'm very confident this conditional works fine 
if (document.getElementsByClassName("l")[0].href == 
     document.getElementById("myFrame").getAttribute("src")) 
    { 
    First();          
    } 
else 
    { 
    var newLink = document.getElementsByClassName("l")[0].href;  // 
    document.getElementById("myFrame").setAttribute("src", newLink); 
    }}; 

First(); 

問題は、First()が定義されているとき、Secondが定義されていないというエラーが発生することです。どのようにこれを解決することができますか?単純なjavascript関数の定義の問題

+2

あなたの実際のコードを投稿してください。ほとんどの状況でそれは起こりません。 – SLaks

+0

ええ、それはうまくいくようです:http://jsfiddle.net/ctrlfrk/Usvty/(あなたが終了条件を持っている限り) – david

答えて

4

更新

更新されたコードは、元のコードとは全く異なります。問題は、あなたがsetTimeoutに渡している文字列のように見えます(これは私には驚きましたが、簡単に複製されました)。私は

function First() { 
    setTimeout(Second, 50); 
} 

function First() { 
    setTimeout("Second()", 50) 
}; 

を変更します...またはあなたがSecondにパラメータを渡す必要がある場合:

function First() { 
    setTimeout(function() { 
     Second(param0, param1); 
    }, 50); 
} 

;の必要は終わりがないことに注意してください関数宣言の後、1つは、setTimeoutがうまくいかない[あなたは実際に必要がありますそれ、ホラーそれは "セミコロン挿入"ですが、この場合は挿入されますが...])

上記の2番目と3番目のバージョンは関数リファレンスを使用しています。オリジナルは文字列を使用してコンパイルされますが、これは不要で問題のようです(this example using the string fails、ただしthis one with the function reference works)。以下の答えのよう

オリジナル回答

、あなたの質問に引用されたコードはでした:コードはうまく動作します

function First() {Second();}; 
function Second() {First();}; 

。無限ループです(つまり、は無限ではありません。最終的に実装には戻り先アドレス用のスタック領域がもうないためです)。工程 - の一部として処理されていることが非常に違うので、それは表現機能を使用しています

var First = function() { 
    Second(); 
}; 
First(); 
var Second = function() { 
    First(); 
}; 

...(:あなたの実際コードをよりこのように見える場合、それは失敗しますExample

宣言(ステップバイステップコードの前にスコープへの入力時に処理されます)ではなく、Secondが定義される前にFirstへの呼び出しがあります。関数式と関数宣言の区別の詳細については、this other answer here on StackOverflowを参照してください。

+0

私がやっているものではない –

+0

ありがとうT.J.! –

+0

@Devin:心配しないで、喜んで助けました。 –

0

私はあなたのコードを試して、 "Second();"最初。 Chromeでうまくいきました。 もちろん、これは永遠にループします。

では、JavaScriptの変数は関数の呼び出し時に非常に遅くバインドされます。大域オブジェクトはまた非常に遅く「束縛された」別の変数でもあります。すべてがいつでも(非同期に)変更できるので、関数が別の関数が利用可能であることを要求してはいけません。 "missing"関数は、関数が呼び出される直前に他のメカニズムによって追加されるかもしれません。 JS-runtimeは、関数が実行される直前にのみ、この関数がスコープ内で使用可能かどうかをチェックする必要があります。

これがChromeで動作する理由です。

var GLOB = this; // bind global obj to variable 

GLOB["First"] = function() { 
    GLOB["Second"](); 
}; 

GLOB["Second"] = function() { 
    GLOB["First"](); 
}; 

はChromeの魅力のようGLOB["Second"]();作品を呼び出す(そして、それは当然のことながらループ):JavaScriptでは、あなたが実際にこのような何かをやっています。多分あなたのブラウザ/ JS-implementation/dev-toolは関数定義に関してより制限的であり、定義される前に関数を使用しないようにしましょう。

その後、function funcname(){}と同じ処理を行い、このobj["funcname"] = function() {}構文を使用する場合がありますが、あなたの「壊れた」JS-インタプリタによってエラーとして検出されないことがあります。私はこれが役に立てば幸い

、 ユベントス

+0

OK、入力中に問題が変わったのを見た。私はまだ私のコメントが役立つことを望む。 – Juve

1

[OK]を、私はあなたの問題を参照してくださいと思います。あなたのコードが関数の中にラップされているはずですか?それでは、関数Secondのようなことはありません。

これは動作しません。

(function() { 
    function First() { 
     setTimeout("Second()", 50) 
    } 
    function Second() { 
     alert('hi!'); 
    } 
    First(); 
})(); 

しかし、これは動作します:

(function() { 
    function First() { 
     setTimeout(Second, 50) 
    } 
    function Second() { 
     alert('hi!'); 
    } 
    First(); 
})();