【问题标题】:Variable scoping in Jquery/JavascriptJquery/Javascript 中的变量作用域
【发布时间】:2012-02-02 22:23:19
【问题描述】:

我有以下代码:

var ids = new Array(5);
$(function(){
html5sql.process(sql, 
    function(transaction, results, rowsArray){
        for(var i = 0; i < rowsArray.length; i++){
            ids[i] = rowsArray[i].ID;
                            console.log(ids[i]); //returns the actual value for i
        }
    },
    function(error, statement){
              console.log("Error: " + error.message);       
            }
);
console.log(ids[0]); //returns undefined
});

如您所见,for 循环内的打印输出打印出正确的值。另一方面,当我在函数之外打印时,我得到了未定义。 范围界定有什么问题?如何获取函数外数组的实际值?

谢谢

【问题讨论】:

  • 欢迎来到 async 的精彩世界!你不能那样做。
  • 这些函数是回调。它们不会立即被调用。
  • 我该如何解决这个问题。谁能给我解释一下发生了什么?
  • 您被告知对html5sql.process() 的调用是异步运行的。对console.log() 的调用在任何值被分配给ids 之后立即发生。您需要延迟对 console.log 的调用,直到处理完成(并且已分配值)。 IE。您有时间问题,而不是范围问题。

标签: javascript jquery html scope


【解决方案1】:
var ids = [];

$( function () {

    html5sql.process( sql, function () {

        // LINE A: you are populating your array here

    });

    // LINE B: the array is still empty here

});

在源代码中,LINE A 确实出现在 LINE B 之上,但这并不一定意味着它执行得更快。这是因为 LINE A 位于函数表达式中,该函数表达式被传递给 process 函数。这个process 函数将在未来某个时间调用该函数表达式。

所以,基本上,LINE B 会立即执行,而 LINE A 会在将来的某个时间点执行。函数表达式可能(作为处理程序)绑定到与 SQL 相关的事件。

【讨论】:

  • 我认为你的解释有点缺陷。代码按顺序执行,但 html5sql() 调用的函数是异步运行的(显然),因此在调用 ids 时它没有为 ids 赋值i>console.log 之后立即生成。
  • @RobG 你能说得更具体点吗?我的回答中的哪个陈述有问题?
  • LINE A does appear above LINE B in the source code, but that doesn't necessarily mean that it executes sooner 的部分。代码是按顺序执行的,但它调用的函数是异步的,所以在调用下一行时它仍在执行。
  • @RobG 我的说法是正确的。 LINE A 不会立即执行,而 LINE B 会立即执行。因此 LINE B 比 LINE A 执行得更快(及时)。事实上,从 OP 提供的代码来看,他 不保证 LINE A 完全执行。当语句html5sql.process(...); 执行时,函数表达式被传递给process 函数——此时该函数表达式的函数体被执行。由process 函数决定是否要立即调用该函数...
  • ...或将其绑定为事件处理程序,以便在将来某个时间触发事件时调用它。因此,我的陈述 - “LINE A 确实出现在源代码中的 LINE B 之上,但这并不一定意味着它执行得更快(及时)” - 是正确的。
猜你喜欢
  • 1970-01-01
  • 2021-09-06
相关资源
最近更新 更多