Javascript var提升问题

时间:2009-07-23 20:40:46

标签: javascript scope

我有一个非常简单的Javascript函数,可以访问MS SQL服务器并返回一些记录。有一个单元格,我想只在它是唯一的时候显示在顶部表格行中。 我相信我的问题是var hoisting,因为我在while循环中分配的变量不起作用,因为该值不是从最后一个记录中进行比较。这是代码

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>';

}

3 个答案:

答案 0 :(得分:6)

var termcounter = rs(0);

取出“var”

你可能是正确的提升 - JavaScript没有块范围,所以两次你宣布termcounter它在同一范围内。这是一个非常常见的错误,因为JavaScript看起来像具有块范围的基于C的语言。

在条件或循环块中声明var等效于在块的范围内在函数的开头声明它。

如果总是将var声明放在函数顶部,那么你将失去更少的头发 - 永远不会在条件或循环块中。 See Crockford。您可以使用JSLint来警告您。 (哦,顺便说一下,你丢失了大量的分号 - JSLint会伤害你的感情。)

那你为什么要重新宣布呢?删除第二个“var”,然后进行分配。


微软的东西对我来说很陌生,但我发现rs(0)语法令人费解。是一个对象吗?或者是否有某种神奇使它成为一个函数(你从来不知道JS)? I did some Googling我想知道你是否需要使用rs.fields(0)或rs.fields(0).name或rs.fields(0).value或其他东西。

答案 1 :(得分:3)

你有这个:

var termcounter = rs(0);

我认为您不想在此重新声明 - 删除var

termcounter = rs(0);

答案 2 :(得分:1)