これが私のコードです:
TextClass = function () {
this._textArr = {};
};
TextClass.prototype = {
SetTexts: function (texts) {
for (var i = 0; i < texts.length; i++) {
this._textArr[texts[i].Key] = texts[i].Value;
}
},
GetText: function (key) {
var value = this._textArr[key];
return String.IsNullOrEmpty(value) ? 'N/A' : value;
}
};
Underscore.jsライブラリを使用していて、SetTexts関数を次のように定義したいと思います。
_.each(texts, function (text) {
this._textArr[text.Key] = text.Value;
});
しかし、ループに入ったときの_textArrは未定義です。
JavaScriptでは、this
として知られる関数コンテキストは機能します かなり異なって 。
これは2つの方法で解決できます。
一時変数を使用してコンテキストを格納します。
_SetTexts: function (texts) {
var that = this;
_.each(texts, function (text) {
that._textArr[text.Key] = text.Value;
});
}
_
3番目のパラメーターを _.each()
に使用して、コンテキストを渡します。
_SetTexts: function (texts) {
_.each(texts, function (text) {
this._textArr[text.Key] = text.Value;
}, this);
}
_
次のように、_.each
呼び出しのコンテキストとしてthis
を渡す必要があります。
_.each(texts, function (text) {
this._textArr[text.Key] = text.Value;
}, this);
http://underscorejs.org/#each のドキュメントを参照してください
javascriptのthis
は、期待どおりに機能しません。この記事を読む: http://www.digital-web.com/articles/scope_in_javascript/
ショートバージョン:
this
の値は、関数を呼び出すたびに変化します。修正するには、this
に等しい別の変数を設定し、代わりにそれを参照します
TextClass = function () {
this._textArr = {};
};
TextClass.prototype = {
SetTexts: function (texts) {
var that = this;
for (var i = 0; i < texts.length; i++) {
that._textArr[texts[i].Key] = texts[i].Value;
}
},
GetText: function (key) {
var value = this._textArr[key];
return String.IsNullOrEmpty(value) ? 'N/A' : value;
}
};
「これ」以外のものを渡すこともできることに注意してください。たとえば、私は次のようなことをします。
var layerGroupMasterData = [[0],[1,2,3],[4,5],[6,7,8,9],[10]];
_.each(layerGroupMasterData,function(layerGroup,groupNum){
_.each(layerGroup, function (layer, i) {
doSomethingThatComparesOneThingWithTheOverallGroup(layerGroupMasterData,layer);
},layerGroups);
},layerGroupMasterData);