JavaScript:全局数组变量返回undefined

时间:2015-05-16 20:12:01

标签: javascript arrays undefined

JavaScript新手在这里。我搜索并搜索了答案,似乎无法解决这个问题。我传递给函数的数组没有作为引用正确传递。我不认为这是一个像许多帖子暗示的异步问题,但我可能是错的。

我有传递给函数的全局数组。在函数内部,数组返回其正确的值,但是当我尝试在函数外部访问它们时,它们是未定义的。

就上下文而言,我正在通过3个阵列,这些阵列保持干球温度,湿球温度和小时,测量结果用于以后的计算。为简洁起见,我只提供了一些示例数据点。示例代码如下:

function run(){
    var hour = [];
    var db = [];
    var wb = [];
    var cities = ["AB Edmonton","MI Detroit"];
    getData(hour, db, wb, cities); 
    //this shows undefined, although within getData it is accurate data
    alert(hour[1]);
}

function getData(hour, db, wb, cities){
    //i= drop-down selection index, set to zero for testing
    i=0;

    switch(cities[i]) {
        case "AB Edmonton":
            hour = [1,2,3];
            db = [15,18,21];
            wb = [10,13,20];
            break;
        //case "MI Detroit":....
    }

    //this shows accurate values in the alert window
    alert(cities[i] + " at hour:" + hour[i] + " the temp is:" + db[i]);

    return [hour, db, wb];
};

4 个答案:

答案 0 :(得分:3)

run将空数组分配给hourdbwb。这些是本地作用于run函数的变量。

然后调用getData并将这些数组作为参数传递。

getData内部声明了新的局部变量(也称为hourdbwb)并分配了在调用函数时传递的三个空数组

然后该函数忽略这些值,新数组覆盖(这些有内容)。

然后返回另一个包含每个数组的新数组。

这将我们带回run。完全忽略getData的返回值和原始数组(仍存储在属于hour的{​​{1}},dbwb变量中被访问(但它们仍然是空的)。

你可以:

  • 操纵run内的现有数组,而不是覆盖它们。 (例如getData可能会成为hour = [1,2,3])。
  • 使用hour.push(1); hour.push(2); hour.push(3)的返回值(在这种情况下,您不需要首先分配值或传递空数组)。您可以使用对象而不是数组,这样您就可以使用有用的名称而不是订单。

这样:

getData

答案 1 :(得分:1)

那些,这些不是全局变量。一个force变量是hour的本地变量,其中run()声明它,另一个变量是var的本地变量,其中它被声明为参数。

getData函数中,您将覆盖行中的局部变量(最初具有getData传递的值)

run()

并且从那里开始,两个变量指的是不同的数组。

答案 2 :(得分:0)

function getData(hour, db, wb, cities){ }

hourdb等是对初始数组的引用。

当您编写hour = [1,2,3];时,hour本地引用不再指向您想要的数组,而是指向刚构建的新数组:[1,2,3]。要解决此问题,只需将值推送到参数即可 hours.push(1,2,3);因此您不会覆盖您的参考文献。

执行此操作时会出现同样的问题:

a = {x : 1};
function setX(obj) {
  obj = {x: 2};
}
function correctSetX(obj) {
  obj.x = 2;
}

setX函数不会执行任何操作,而correctSetX会将a与{x : 2}相关联。

答案 3 :(得分:0)

谢谢大家的帮助!我已经发布了如何根据评论编辑代码以使其工作的方式。几件事:

-I已将所有变量移动到getData()函数中的本地变量。至少有一条评论给人的印象是更好的做法是保持变量本地化(请原谅我,我不是通过培训的CSE人,但我很感谢你的提示和耐心)

- 我无法简单地使用.push方法,因为数据量导致了错误。 (每年至少有8760次测量)我无法记住确切的错误,但它与堆栈限制有关

- 根据Quentin的建议,我改为创建了一个具有数组属性的dataSet对象。该对象是getData函数返回的内容。再次感谢你,这是一个更好的方法来处理这个

以下示例(数据有限):

function run(){

    //get data
    var dataSet = getData(); 
    //test the result on the 2 hour reading
    alert(dataSet.hour[1]); 
}

function getData(){
//i= drop-down selection index, set to zero for testing
var i=0;
var hour,db,wb;
var cities = ["AB Edmonton","MI Detroit"];
switch(cities[i]){

    case "AB Edmonton":
        hour = [1,2,3];
        db = [10,11,12];
        wb = [13,14,15];
        break;
    //case "MI Detroit":...
} //end of switch

return {hour: hour, db: db, wb: wb};
}; //end of getData