我正在使用Node.js编写一个小游戏,我想以两种不同的语言提供。
为了显示不同游戏模式的翻译列表及其各自的描述,我使用的是Array.prototype.map(callback, thisArg)
,但看起来Node忽略了thisArg
参数:
sendMessage(translated[channel.id].modeList + modes.filter(a => {
if (typeof a === "string")
return true;
return false;
}).map(translated.modeDesc, translated[channel.id]).join("\n"));
translated
:
const translated = {
"chooseLang" : "Choose a language",
"invalidOption" : "Invalid option",
"modeDesc" : mode => {return mode + " : " + "<" + modes[0][mode].join("|") + ">\n = " + this.modeDescs[mode];},
"(channel id)" : global.en
};
global.en
:
const en = {
"modeList" : "Here is a list of available gamemodes :",
"modeDescs" : {
"mode" : "description"
}
};
看起来Node尝试使用translated.modeDescs
,而不是translated[channel.id].modeDescs
(global.en.modeDescs
){/ p>
TypeError: Cannot read property 'mode' of undefined
at Object.ruleDesc (/home/algorythmis/Documents/Game/main.js:89:111)
at Array.map (native)
...
那么,Node真的忽略了thisArg
还是我只是以错误的方式?我能做些什么来实现我想要的行为?
提前致谢。
答案 0 :(得分:1)
使用arrow function时,词法范围将被保留,因此this
指的是translated
对象定义的上下文,而不是实际的保存对函数的引用的对象。
尝试使用常规功能:
"modeDesc" : function(mode) {return mode + " : " + "<" + modes[0][mode].join("|") + ">\n = " + this.modeDescs[mode];}
或使用call
显式设置上下文:
var data = translated[channel.id].modeList + modes.filter(a => { ... });
data = Array.prototype.map.call(translated, translated.modeDesc);
sendMessage(data);
请参阅MDN