javascript超出范围

时间:2012-04-19 21:22:38

标签: javascript scope

基于chrome开发人员工具的断点,我认为我正在处理我可以解决的范围问题。这是我定义函数的方式吗?下面的脚本是一个包含js文件和数组'timeStamp我想在其他函数中使用,而不必每次都调用我的loadData函数。

timeStamp数组在离开函数之前离开for循环后变为未定义。

var timeStamp = [];  // Want this array to be global

function loadData (url){

        $.getJSON(url, function(json) {

            for (var i=0;i<json.length;i++){
                    timeStamp.push(json[i].TimeStamp);  
                }
                    console.log(inputBITS); //returns the value
            });
        console.log(inputBITS); //undefined
        }

感谢anyhelp

2 个答案:

答案 0 :(得分:6)

看起来问题是getJSON是异步的。当它执行并完成并且您的代码继续时,它仅指示网络操作的START以检索数据。实际的网络操作要到一段时间后才能完成。

完成后,将调用成功处理程序(指定为getJSON()调用的第二个参数)并填充timeStamp数组。只有在调用成功处理程序后,timeStamp数组才有效。

因此,您不能在紧跟timeStamp调用之后的代码中使用getJSON()数组(它尚未填充)。如果其他代码需要timeStamp数组,则应该从成功处理程序调用该代码或使用其他一些计时机制来确保使用timeStamp数组的代码不会尝试使用它在调用成功处理程序并填充timeStamp数组之后。

可以使一些Ajax调用是同步的而不是异步的,但这通常是一个非常糟糕的主意,因为它在整个网络操作期间锁定浏览器,这对查看者非常不友好。修复编码逻辑以使用异步网络要好得多。

像这样的ajax调用的典型设计模式如下:

function loadData (url){

    $.getJSON(url, function(json) {
        // this will execute AFTER the ajax networking finishes
        var timeStamp = [];
        for (var i=0;i<json.length;i++) {
                timeStamp.push(json[i].TimeStamp);  
        }
        console.log(timeStamp);
        // now call other functions that need timeStamp data
        myOtherFunc(timeStamp);
     });
     // this will execute when the ajax networking has just been started
     //
     // timeStamp data is NOT valid here because 
     // the ajax call has not yet completed
     // You can only use the ajax data inside the success handler function
     // or in any functions that you call from there
}

答案 1 :(得分:2)

这是另一个不懂基本AJAX的人......

getJSON 异步 。意思是,代码在函数调用之后和成功返回JSON请求之前保持运行。

你可以通过强制请求与适当的标志同步来“修复”这个问题,但出于很多原因这是一个非常糟糕的主意(其中最重要的是你违反了 A <的基本思路/强> JAX)。最好的方法是记住AJAX的工作原理,并将AJAX返回时应该执行的所有代码放在正确的位置。