Array.prototype.map(callback,thisArg),第二个参数被忽略

时间:2017-02-05 14:32:39

标签: javascript node.js

我正在使用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].modeDescsglobal.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还是我只是以错误的方式?我能做些什么来实现我想要的行为?

提前致谢。

1 个答案:

答案 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