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];
};
答案 0 :(得分:3)
run
将空数组分配给hour
,db
和wb
。这些是本地作用于run
函数的变量。
然后调用getData
并将这些数组作为参数传递。
在getData
内部声明了新的局部变量(也称为hour
,db
和wb
)并分配了在调用函数时传递的三个空数组
然后该函数忽略这些值,用新数组覆盖(这些有内容)。
然后返回另一个包含每个数组的新数组。
这将我们带回run
。完全忽略getData
的返回值和原始数组(仍存储在属于hour
的{{1}},db
和wb
变量中被访问(但它们仍然是空的)。
你可以:
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){ }
hour
,db
等是对初始数组的引用。
当您编写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