2012-01-05 71 views
0

我有以下代码:变量范围jQuery的/ JavaScript的

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循环打印出正确的值里面打印出来。另一方面,当我在函数之外打印时,我得到的是未定义的。 范围的问题是什么?我怎样才能得到该函数之外的数组的实际值?

由于

+4

欢迎来到** async **的精彩世界!你不能那样做。 – SLaks 2012-01-05 01:53:38

+0

这些函数是回调函数。他们不会立即被调用。 – 2012-01-05 01:56:11

+0

我该如何解决这个问题。任何人都可以向我解释发生了什么? – locorecto 2012-01-05 01:58:12

回答

3
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不在源代码中出现线B的上方,但是,这并不一定意味着它执行越快。这是因为LINE A在传入process函数的函数表达式中。这个函数将在未来某个时候调用该函数表达式。

因此,基本上,LINE B立即执行,并且LINE A在将来的某个点执行。函数表达式可能会作为一个处理程序绑定到SQL相关事件。

+0

我认为你的解释有点有缺陷。代码按顺序执行,但由* html5sql()*调用的函数异步运行(显然),所以当* console.log *之后立即调用时,它没有为* id *赋值。 – RobG 2012-01-05 02:42:24

+0

@RobG你能更具体吗?我的回答中有什么声明是有问题的? – 2012-01-05 02:57:35

+0

“LINE A”的部分出现在源代码的LINE B上方,但这并不一定意味着它会更早执行。代码是按顺序执行的,但它调用的函数是异步的,所以在下一行被调用时它仍然在执行。 – RobG 2012-01-05 04:04:00