2009-07-23 6 views
3

私はMS SQLサーバーにヒットし、いくつかのレコードを返す非常に単純なJavascript関数を持っています。一番上の表の行に表示されるセルは、一意のときだけです。 私は問題がvar hoistingだと思うのですが、whileループ内で代入する変数は、値が最後のレコードから持ち込まれていないために機能しないためです。ここでJavascript var hoisting issue

function searchIndex() 
{ 

    var termcounter = ""; 

    flyoutHTML = '<table>'; 

    var adOpenDynamic = 2 
    var adLockOptimistic = 3 

    var conn = new ActiveXObject("ADODB.Connection"); 
    var connectionstring = "Provider=SQLOLEDB;Server=XXXXXXXX;INTEGRATED SECURITY=SSPI;DATABASE=YYYYYYYYYY;" 

    conn.Open(connectionstring) 
    var rs = new ActiveXObject("ADODB.Recordset") 

    rs.Open("SELECT field1, field2, field4, field4, field5 FROM dbo.table;", conn) 

    if (rs.eof) 
    { 
    flyoutHTML += '<tr><td align="center">No Records Found!</td></tr>'; 
    } 
    else 
    { 


    while(!rs.eof) 
    { 

    if (termcounter != rs(0)) 
    { 
     var termcounter = rs(0); 
     flyoutHTML += '<tr>'; 
     flyoutHTML += '<td colspan="3">' + rs(0) + '</td>'; 
     flyoutHTML += '</tr>'; 
    } 


    flyoutHTML += '<tr>'; 
    flyoutHTML += '<td>' + rs(1) + '</td><td>' + rs(2) + '</td><td>' + rs(3) + '</td>'; 
    flyoutHTML += '</tr>'; 

    rs.movenext 

    } 
    rs.close 
    conn.close 


    flyoutHTML += '</table>'; 

} 
+1

Googleは遍在しています。私はちょうどいくつかの公式ドキュメントを取得するために "javascript var hoisting"をgoogledしています。ページの最初の結果は、この非常に疑問でした。 –

+0

ハハ。それはうっすらです! – Nosredna

答えて

6

あなたは巻上についておそらく正しいvar termcounter = rs(0);

オフ「VAR」を取るのコードがある - それは同じでありますtermcounter JavaScriptは、あなたが宣言するので、両方の時間をブロックスコープを持っていません範囲。 JavaScriptはブロックスコープのC言語に似ているので、これは非常によくある間違いです。

条件付きブロックまたはループブロックでvarを宣言することは、ブロックが入っている関数の先頭にscope-wiseを宣言することと同じです。

常にvarの宣言を関数の先頭に置くと、条件付きまたはループブロックではなくなります。 See CrockfordJSLintを使用して警告することができます。 (ああ、ちょっとしたセミコロンがない - あなたの気持ちを損なうでしょう)

なぜそれを再宣言していますか? 2番目の "var"を削除して、割り当てをしてください。


Microsoftのものは私にとっては異例ですが、rs(0)の構文はわかりません。 rsはオブジェクトですか?または、それを関数にする何らかの魔法がありますか(あなたはJSで知らないでしょう)? I did some Googlingとrs.fields(0)またはrs.fields(0).nameまたはrs.fields(0).valueなどを使用する必要があるのだろうかと思います。

+0

IE6では、配列要素が大括弧ではなくかっこを使って読み込まれたケースを見たことがあります。そしてそれは働いた。 –

+0

あなたは私にIE6片頭痛のうち1つを与えているので、取り除くのがとても難しいです! – Nosredna

+1

Chromeのコンソールで角括弧ではなく括弧で括ってみました。立ち入り禁止。 _TypeError:オブジェクトは関数ではありません。IE6の狂気はもう聞きません。 :-) – Nosredna

3

あなたがこの持っている:

var termcounter = rs(0); 

を私はあなたがここでそれを再宣言することにしたいとは思わない - varを削除:

termcounter = rs(0);