javascript-如何在循环中调用闭包

javascript-如何在循环中调用闭包,javascript,loops,closures,Javascript,Loops,Closures,可能重复: 我知道我需要用闭包来处理这个问题,但我不知道怎么做; 我具有从服务器获取数据的功能: function loadGraph(chartDataStreams) { //length of chartDataStreams is two initCharts(); //init charts area for (c in chartDataStreams) { var chartData = []; alert(c); // says : 0, then 1

可能重复:

我知道我需要用闭包来处理这个问题,但我不知道怎么做; 我具有从服务器获取数据的功能:

function loadGraph(chartDataStreams) { //length of chartDataStreams is two

  initCharts(); //init charts area
  for (c in chartDataStreams) {
    var chartData = [];
    alert(c); // says : 0, then 1
    getDataFromServer(chartDataStreams[c].x, chartDataStreams[c].y,function (data) {
       for (d in data.datapoints) {
         var item = { date: new Date(data.datapoints[d].at), value:data.datapoints[d].value };
         chartData.push(item);
        }
      alert(c); // says: 1 then 1
      updateGraphData(chartData); 

    });
  }
}
在这个函数中,我需要调用updateGraphData,它用chartData更新图形数据提供程序。问题是,在chartData中,我不仅拥有实际数据,还拥有上一个循环周期的数据。我认为这是使用闭包的正确地方,但我不确定如何。。你有什么想法吗


//编辑:我错误地将chartData的声明放在getDataFromServer函数之外,但我仍然有一个问题:检查编辑的代码。在第二个警报中,我想说0和1,而不仅仅是1,1,在回调中而不是在外部实例化
chartData

function loadGraph(chartDataStreams) {
    initCharts();
    for (c in chartDataStreams) {
        getDataFromServer(chartDataStreams[c].x, chartDataStreams[c].y, function (data) {

            var chartData = []; // RIGHT HERE

            for (d in data.datapoints) {
                var item = {
                    date: new Date(data.datapoints[d].at),
                    value: data.datapoints[d].value
                };
                chartData.push(item);
            }
            updateGraphData(chartData);
        });
    }
 }
这样,每个回调在被调用时都会获得自己的新
chartData
数组

块在JavaScript中不创建变量作用域,只创建函数,因此外部
chartData
的作用域是外部函数,并在每次循环迭代中被覆盖


它的最后一次覆盖是所有回调在最后调用时使用的,因此所有数据都会在该共享数组中结束。

您有没有理由两次声明
chartData
?另外,您能否描述什么不起作用,或者实际结果与预期结果的对比是什么?最好也看看
updateGraphData
实现。并尝试在循环之前清空charData,只需写入chartData=[];在匿名函数内部,删除第二个声明性所以,天哪,我是个白痴:-D我复制粘贴了我以前编写的代码,错误地在函数外部声明了它,但仍然存在变量值相同的问题。。我编辑了原始问题这是正确的,但是为什么?你能检查原始问题吗?我编辑了它