晚上好,初学者在这里。
我正在解决本书https://eloquentjavascript.net/16_game.html#i_cNfzuXtVqI中的一个练习,我想我快完成了,但是有一个细节。当我在if(arrowKeys.EscapeUp){...}
内输出“ arrowKeys”对象的状态时,程序返回的日志状态很好,但是当我在控制台上访问该对象的属性时,其值不同。我想知道为什么我会得到不同的值,以及是否有办法解决它
<link rel="stylesheet" href="css/game.css">
<body>
<script>
function trackKeys(keys) {
let down = Object.create(null);
function track(event) {
if (keys.includes(event.key)) {
down[event.key] = event.type == "keydown";
down["EscapeUp"] = event.type == "keyup" && event.key == "Escape";
event.preventDefault();
}
}
window.addEventListener("keydown", track);
window.addEventListener("keyup", track);
return down;
}
const arrowKeys =
trackKeys(["ArrowLeft", "ArrowRight", "ArrowUp", "Escape"]);
function runLevel(level, Display) {
let display = new Display(document.body, level);
let state = State.start(level);
let ending = 1;
return new Promise(resolve => {
runAnimation(time => {
let pause = 0;
if(arrowKeys.EscapeUp) {
console.log(arrowKeys);
console.log(arrowKeys.EscapeUp);
if(pause == 0) pause = 1;
else pause = 0;
}
if(pause == 0){
state = state.update(time, arrowKeys);
display.syncState(state);
if (state.status == "playing") {
return true;
} else if (ending > 0) {
ending -= time;
return true;
} else {
display.clear();
resolve(state.status);
return false;
}
}
});
});
}
runGame(GAME_LEVELS, DOMDisplay);
</script>
</body>
这是我最初得到的,似乎是“正确”的输出,也是我“访问”该对象时希望得到的(单击3个绿色的点):
但是当我访问它时,我得到了:
即使函数运行时,“ EscapeUp”之类的属性的值为“ true”。
您可以在这里运行我的代码:https://eloquentjavascript.net/code/#16.2,以便您可以复制我尝试的内容(在游戏运行时按逃逸按钮)