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];
};

===============>>#1 票数:3 已采纳

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

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

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

然后该函数忽略这些值并用新数组 覆盖它们(这些数组具有内容)。

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

这让我们重新run 完全忽略getData的返回值,并访问原始数组(仍然存储在属于runhourdbwb变量中)(但它们仍为空)。

你可以:

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

这样:

function run(){
    var cities = ["AB Edmonton","MI Detroit"];
    var data = getData(cities); 
    alert(data.hour[1]);
}

function getData(cities){
    //i= drop-down selection index, set to zero for testing
    var i=0; // Use locally scoped variables where possible
    var hour, db, wb;

    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: hour, db: db, wb: wb];
};

===============>>#2 票数:1

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

在你的getData函数中,你将在行中覆盖局部变量(最初具有run()传入的值)

 hour = [1,2,3];

从那以后,这两个变量指的是不同的数组。

===============>>#3 票数: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将与{x : 2}

===============>>#4 票数:0

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

- 我已将所有变量移到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

  ask by coolhand translate from so

未解决问题?本站智能推荐:

2回复

全局数组未定义

我有一个简单的jQuery脚本来显示/隐藏手风琴样式的列表元素,以及一个全局布尔数组来保存显示/隐藏的列表。 但是,当从显示/隐藏不同的子列表切换时,布尔数组变得不确定,即(我用form_nav_links调用函数来显示该列表,然后当我尝试立即显示help_nav_links时,该数组是不确定
2回复

Javascript数组元素返回undefined

它是一个非常简单的带有js脚本的html文档。 js文件是: 但它返回undefined,无论如何,如果只是提醒picspics,它将返回“对象节点列表”,听起来不错。 起初,我认为这是一个dom加载问题,所以我补充说 我的代码之外,也失败了。 总而言之,当我
4回复

Javascript循环和构建数组但变量索引未定义

不要笑认为我有一个漫长的一天工作的金发时刻,因为我有点与JS练习。 任何帮助赞赏我认为是一个愚蠢的简单问题。 我一直在尝试将它添加到数组并构建它时,未定义optionarray [i]。 我知道我做了一些可笑的傻事我只是记不清楚:) 非常感谢您提前提供任何帮助。
1回复

Javascript - 仅返回未定义的数组索引[duplicate]

这个问题在这里已有答案: 对象和console.log的奇怪行为 3答案 这是我的代码: 它读取上载的文件并将原始文件保存在数据对象(propertiesData)中。 问题是这部分: 的console.log(readFiles); 示出的像原
1回复

Javascript-将值推入数组返回未定义

此处新增了javascript。 我有一个简单的表单,可以接收用户提交的内容并将其放入数组中。 提交特定单词时,系统会提示您输入数组中的随机值。 我认为我在这里遇到的问题是事情实际上并没有被推送到数组中,因为提示将返回未定义的内容。 现在这是固定的- HTML部分:
2回复

在对象数组上使用函数变量时,Javascript为“未定义”

我有以下(示例)对象数组: 这个函数可以很好地遍历它们: 但是,如果要通过使用函数变量访问其中的对象来抽象化此函数以用于类似的数组,如下所示: 如下所述调用时,结果为“ undefined”(由于“ arrId”不是对象名,因此我很期待): 如何使用传递给函数变量
2回复

javascript:全部数组