0

次のコードがあります。

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[]and colorsandにアクセスできるようにしたい。外部コンテキストをこの関数に渡すにはどうすればよいですか? それとも別の代替手段がありますか?kfor (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ループ内ではkorにアクセスできませんがcolors、意外にも にアクセスできますthat。私は非常に混乱しています...

わかりました。他の問題があった可能性があります。現在は機能しているため、後でもう一度チェックして、どこに問題があるかを突き止めます。

4

1 に答える 1

1

これらの変数は foreach コールバック内でクロージャ変数としてすでにアクセス可能です

私が見るかもしれない唯一の変更は、 forEach()のparam をthat支持してvariable の使用を削除することです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++;
}
于 2013-09-27T00:09:44.757 に答える