对变量,函数及其背后的逻辑有疑问吗?

时间:2018-10-15 23:36:33

标签: javascript function object variables

我来这里已经有一段时间了。

我正在关注有关JavaScript文本库冒险的教程。非常基础的教程。我有一个改变房间的功能。我了解其背后的逻辑,并且有效。

直到进入goInside(),它不会给我错误;

property 'description' of undefined
    at goInside (core.js:58)
    at playerInput (core.js:94)
    at HTMLDocument.<anonymous> (core.js:114)
    at HTMLDocument.dispatch (jquery-3.2.1.min.js:3)
    at HTMLDocument.q.handle (jquery-3.2.1.min.js:3)
goInside @ core.js:58
playerInput @ core.js:94
(anonymous) @ core.js:114
dispatch @ jquery-3.2.1.min.js:3
q.handle @ jquery-3.2.1.min.js:3


function changeRoom(dir) {
    if (rooms[currentRoom].directions[dir] !== undefined) {
        currentRoom = rooms[currentRoom].directions[dir]
        $('#game-text').append("<p>" + rooms[currentRoom].description + "</p>");
    } else {
        $('#game-text').append("<p>You cannot go that way!</p>");
    }
}

这是房间变量,我花了一点时间来了解格式。我添加了建筑物作为一种选项,其作用与指示类似。

var rooms = {
    "start": {
      "description": "You are in Town waiting for something to happen",

      "details": "You notice a house and a shop. Should you explore?",

      "directions": {
        "north": "bridge",
        "west": "clearing"
      },

      "buildings": {
        "shop": "shop",
        "house": "house"
      },

      "items": ["water", "stick"],

      "minlvl": "1",
    },

当前房间开始。您可以输入“向北”。它将改变房间的罚款。但是,如果我想使用4种以上的不同方式怎么办?我以为这可能有效,但无法弄清楚我哪里出了问题。我重用了该功能,但切换了各个元素。

function goInside(building) {
    if (rooms[currentRoom].buildings[building] !== undefined) {
        currentRoom = rooms[currentRoom].buildings[building],
        $('#game-text').append("<p>" + rooms[currentRoom].description + "</p>");
    } else {
        $('#game-text').append("<p>You cannot go that way!</p>");
    }
}

不找人为我编程,只是在解释我可能会缺少的逻辑。对于任何反馈,我们都表示感谢。谢谢。

编辑。

查看您的解决方案时,我使用了if语句,但仍然出现以下错误。我不明白,因为changeRooms可以很好地显示说明,而goInside是changeRooms的副本。

Uncaught TypeError: Cannot read property 'description' of undefined
    at goInside (core.js:58)
    at playerInput (core.js:94)
    at HTMLDocument.<anonymous> (core.js:114)
    at HTMLDocument.dispatch (jquery-3.2.1.min.js:3)
    at HTMLDocument.q.handle (jquery-3.2.1.min.js:3)
goInside @ core.js:58
playerInput @ core.js:94
(anonymous) @ core.js:114
dispatch @ jquery-3.2.1.min.js:3
q.handle @ jquery-3.2.1.min.js:3

第58行

$('#game-text').append("<p>" + rooms[currentRoom].description + "</p>");

第94行是goInside函数

case "explore":

            var building = input.split(" ")[1];
            goInside(building);
            break;

2 个答案:

答案 0 :(得分:0)

确保所有房间都具有buildings属性。如果您没有其他可从该房间进入的建筑物,则该属性应为空对象,例如

"buildings": {},

否则,尝试访问rooms[currentRoom].buildings[building]时会出错。即使您正在测试是否已定义此对象,如果没有开头的对象,它也无法使用[building]索引对象。

或者您需要对此进行goInside()功能检查。

function goInside(building) {
    if (rooms[currentRoom].buildings && rooms[currentRoom].buildings[building]) {
        currentRoom = rooms[currentRoom].buildings[building],
        $('#game-text').append("<p>" + rooms[currentRoom].description + "</p>");
    } else {
        $('#game-text').append("<p>You cannot go that way!</p>");
    }
}

答案 1 :(得分:0)

关于错误的最直接的提示来自错误:Uncaught TypeError: Cannot read property 'description' of undefined。看一下您在哪里尝试阅读description

 $('#game-text').append("<p>" + rooms[currentRoom].description + "</p>");

因此,rooms[currentRoom]返回undefined。一个合理的解释是,如果您尝试输入例如“商店”,但尚未定义rooms['shop']。确保您有一个为“商店”定义的房间,即

rooms = {
  "shop": {
    // definition similar to "start" etc.
  }
  // ... the rest of the rooms
}