如何将上下文传递给for ... in循环

时间:2013-09-27 00:07:09

标签: javascript

我有以下代码:

var that = this, k,
    colors = ['#468966','#FFF0A5','#FFB033B','#B64926','#8E2800'];
    data = [];

    that.k=0;
    for (var i in answers){
            data.push({
                key: i,
                color: colors[k%5],
                values: []
            });
            answers[i].forEach(function(answer,index){

                that.data[k].values.push({
                    label: 'user_'+index,
                    value: answer.answer
                });
            });
        that.k++;
    }

我希望能够在data[]循环中访问colorsk以及for (var i in answers)。如何将外部上下文传递给此函数?或者还有另一种选择吗?

我可能省略了一些信息:这是在函数内部,所以代码如下:

  var createChartData = function(answers){
    var that = this, k,
    colors = ['#468966','#FFF0A5','#FFB033B','#B64926','#8E2800'];
    data = [];

    k=0;

    for (var i in answers){
            data.push({
                key: i,
                color: colors[k%5],
                values: []
            });
            debugger;
            answers[i].forEach(function(answer,index){

                that.data[k].values.push({
                    label: 'user_'+index,
                    value: answer.answer
                });
            });
        k++;
    }
return data;
}

但我认为这应该是无关紧要的。在for循环内,我无法访问kcolors,令我惊讶的是我可以访问that。我很困惑......

好吧,我可能还有其他一些问题,因为现在它有效,我会稍后再检查一下,找出问题所在。

1 个答案:

答案 0 :(得分:1)

这些变量已作为closure变量

在foreach回调中可访问

我可能会看到的唯一变化是删除变量that的使用,转而使用forEach()thisArg参数

var k,
    colors = ['#468966', '#FFF0A5', '#FFB033B', '#B64926', '#8E2800'];
data = [];

this.k = 0;
for (var i in answers) {
    data.push({
        key: i,
        color: colors[k % 5],
        values: []
    });
    answers[i].forEach(function (answer, index) {

        this.data[k].values.push({
            label: 'user_' + index,
            value: answer.answer
        });
    }, this);
    this.k++;
}