这是我的代码:
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是未定义的。
答案 0 :(得分:37)
在JavaScript中,函数上下文(称为this
)可以使用rather differently。
您可以通过两种方式解决此问题:
使用临时变量存储上下文:
SetTexts: function (texts) {
var that = this;
_.each(texts, function (text) {
that._textArr[text.Key] = text.Value;
});
}
使用第_.each()
个参数传递上下文:
SetTexts: function (texts) {
_.each(texts, function (text) {
this._textArr[text.Key] = text.Value;
}, this);
}
答案 1 :(得分:6)
您必须将this
作为_.each
调用的上下文传递,如下所示:
_.each(texts, function (text) {
this._textArr[text.Key] = text.Value;
}, this);
的文档
答案 2 :(得分:1)
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;
}
};
答案 3 :(得分:0)
请注意,您也可以传递“this”之外的其他内容。例如,我做了类似的事情:
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);