I have the following function which constructs one or more y-axes for a Highcharts chart, though my problem has little or nothing to do with the Highcharts API.
_constructYAxes: function(yAxes) {
    if (yAxes) {
        var highChartYAxes = [];
        for (var i = 0; i < yAxes.length; i++) {
            var kpiUnits = yAxes[i].units;
            var axisUnits = 'units ' + i;
            var axisLabel = 'label ' + i;
            // construct an Highcharts y-axis object
            var yAxis = {
                labels: {
                    formatter: function() {
                        return this.value + ' ' + axisUnits;
                    }
                },
                title: {
                    text: axisLabel
                },
            };
            highChartYAxes.push(yAxis);
        }
        // pass all the y-axes to the chart
        this.chartOpts.yAxis = highChartYAxes;
    }
}
The problem is that the same label is used for each y-axis, even though the title is displayed correctly. The difference betweent hese two is that the former is calculated by invoking a function
labels: {
    formatter: function() {
        return this.value + ' ' + axisUnits;
    }
},
So if I have a chart with 3 y-axes, the label "units 2" appears on all of them.
I think the problem is that the formatter function closes over the value of axisUnits in the last iteration of the loop, such that when the function is invoked (by Highcharts), it uses the same value of axisUnits each time.
What can I do to force the function to use the i-th value of axisUnits each time it is invoked instead?
Clearly my understanding of JavaScript scoping is somewhat lacking (I am frequently surprised by what this evaluates to in different contexts). If anyone knows of some good online resources that might help me to get this straight, please send them my way.
 
     
     
     
    