【问题标题】:Javascript var hoisting issueJavascript var提升问题
【发布时间】:2009-07-23 20:40:45
【问题描述】:

我有一个非常简单的 Javascript 函数,它可以访问 MS SQL 服务器并返回一些记录。有一个单元格,我只想在它唯一时才显示在顶部表格行中。 我相信我的问题是 var 提升,因为我在 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>';

}

【问题讨论】:

  • Google 正变得无所不在。我刚刚在 Google 上搜索了“javascript var 提升”以获取一些官方文档,页面上的第一个结果就是这个问题。

标签: javascript scope


【解决方案1】:

去掉var termcounter = rs(0);的“var”

关于提升你可能是对的——JavaScript 没有块作用域,所以你两次声明 termcounter 它都在同一个作用域内。这是一个非常常见的错误,因为 JavaScript 看起来像基于 C 语言的块作用域。

在条件块或循环块中声明 var 等效于在该块所在函数的开头声明它,范围方面。

如果你总是把你的 var 声明放在函数的顶部——从不在条件或循环块中,你会减少头发。 See Crockford。您可以使用JSLint 来警告您。 (哦,顺便说一下,你少了很多分号——JSLint 会伤害你的感情。)

那你为什么要重新声明它?删除第二个“var”并执行分配。


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

【讨论】:

  • 我记得我曾经在 IE6 中看到一个案例,其中数组元素是使用括号而不是方括号读取的。它奏效了。
  • 哦。你给了我一种难以摆脱的 IE6 偏头痛!
  • 我只是在 Chrome 的控制台中尝试了括号而不是括号。不去。 TypeError: object is not a function 我不会再听到你的 IE6 疯狂了。 :-)
  • 函数可以在 javascript 中具有属性。由于我们在这里讨论的是“宿主对象”,它所需要的只是在内部具有某种“调用”参数,并且您可以像调用函数一样调用它,即使 typeof rs !== "function" 也是如此。 (ecmascript 提交修复了 ES5 中的那个小问题。现在,当您将所有可调用对象用作 typeof 运算符的操作数时,所有可调用对象都必须返回“function”。
  • 你可以在 IE6 中尝试一下。 typeof alert !=="function"
【解决方案2】:

你有这个:

var termcounter = rs(0);

我认为您不想在这里重新声明它 - 删除 var:

termcounter = rs(0);

【讨论】:

    【解决方案3】:
    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2017-07-18
    • 2021-07-19
    • 1970-01-01
    • 2019-04-01
    相关资源
    最近更新 更多