Объявление переменной внутри функции возвращает undefine

1

Вот мой код:
Javascript:

  var currency = {
      coins: 0,
      golds: 0,
      orb: 0
    };
    var resources = {
      coals: 0,
      irons: 0,
      silvers: 0,
      diamonds: 0
    };
    var player = {
      HP: 0,
      baseHP: 100,
      weaponHP: 0,
      ATK: 0,
      baseATK: 1,
      weaponATK: 0,
      DEF: 0,
      baseDEF: 5,
      weaponDEF: 0,
      DEX: 0,
      baseDEX: 5,
      weaponDEX: 0,
      crit: 0,
      baseCrit: 5,
      weaponCrit: 0,
      level: 1,
      currentEXP: 0,
      expLeft: 10
    };
    var unlocked = {
      shop: false,
      tab: false,
      numberOfGolds: false,
      mine: false,
      resources: false,
      throw10Coins: false,
      woodenSword: false,
      ironSword: false,
      hatchet: false,
      woodenShield: false,
      spikeShield: false,
      blade: false,
      battleAxe: false,
      broadSword: false,
      mace: false,
      bomb: false,
      angleSword: false,
      hacker: false
    };
    var weapon = {
      hatchet: {
        atk: 2,
        def: -1,
        dex: 0,
        hp: 0,
        crit: 0
      },
      woodenSword: {
        atk: 5,
        dex: 0,
        def: 0,
        hp: 0,
        crit: 0
      },
      ironSword: {
        atk: 10,
        crit: 5,
        dex: 0,
        def: 0,
        hp: 0
      },
      blade: {
        atk: 25,
        crit: 20,
        dex: 10,
        hp: 0,
        def: 0
      },
      mace: {
        atk: 30,
        def: 5,
        dex: -1,
        hp: 0,
        crit: 0
      },
      battleAxe: {
        atk: 50,
        def: 5,
        dex: 0,
        hp: 0,
        crit: 0
      },
      broadSword: {
        atk: 100,
        def: 20,
        dex: 0,
        crit: 0,
        hp: 0
      },
      woodenShield: {
        atk: 0,
        def: 10,
        dex: 0,
        hp: 0,
        crit: 0
      },
      spikeShield: {
        def: 15,
        atk: 5,
        dex: 0,
        crit: 0,
        hp: 0
      },
      bomb: {
        atk: 0,
        def: 0,
        crit: 0,
        hp: 0,
        dex: -5
      },
      angleSword: {
        atk: 500,
        def: 100,
        crit: 25,
        hp: 100,
        dex: 10
      }
    }

    function stat(x) {
      reStat();
      player.baseATK = 1;
      player.baseDEF = 5;
      player.baseDEX = 5;
      player.baseHP = 100;
      player.baseCrit = 5;
      player.weaponATK = weapon[x].atk;
      player.weaponDEF = weapon[x].def;
      player.weaponDEX = weapon[x].dex;
      player.weaponHP = weapon[x].hp;
      player.weaponCrit = weapon[x].crit;
      player.ATK = player.baseATK + player.weaponATK;
      player.DEF = player.baseDEF + player.weaponDEF;
      player.DEX = player.baseDEX + player.weaponDEX;
      player.HP = player.baseHP + player.weaponHP;
      player.crit = player.baseCrit + player.weaponCrit;
      document.getElementById('atk').innerHTML = player.baseATK + player.weaponATK;
      document.getElementById('def').innerHTML = player.baseDEF + player.weaponDEF;
      document.getElementById('dex').innerHTML = player.baseDEX + player.weaponDEX;
      document.getElementById('hp').innerHTML = player.baseHP + player.weaponHP;
      document.getElementById('crit').innerHTML = player.baseCrit + player.weaponCrit + '%';
    }

    function reStat() {
      player.ATK = 0;
      player.DEF = 0;
      player.DEX = 0;
      player.crit = 0;
      player.HP = 0;
    }
    var gold = {
      health: 30
    }

    function move(flag) {
      if (flag == 'true') {
        player.x += 1
      }
      if (flag == 'false') {
        void(0)
      }
    }

    function start(place) {
      if (place == 'goldMine') {
        canvas = document.getElementById('canvas');
        ctx = canvas.getContext('2d');
        var player = {
          x: 0,
          y: 198,
          speed: 3
        };
        var slope = {
          x: 148,
          y: 198,
          up: false
        }
        var gold = {
          x: 200,
          y: 185,
          health: 30,
          mined: false,
          x1: 240,
          y1: 185,
          mined1: false
        }
        var time = 30;
        var canDamage = false;
        var time = 50;
        switchQuest();
        ctx.font = '15px Monospace';

        function draw() {
          ctx.clearRect(0, 0, canvas.width, canvas.height);
          ctx.fillText('\\o/', player.x, player.y);
          ctx.fillText("__________________", 0, 197);
          ctx.fillText("/", slope.x, slope.y);
          ctx.fillText("______________________________________________________", 155, 185);
          if (!gold.mined) {
            ctx.fillText("/O\\", gold.x, gold.y);
          }
          ctx.fillText("/O\\", gold.x1, gold.y1);
          player.x += player.speed;
          if (player.x >= slope.x - 17 && !slope.up) {
            player.y -= 13;
            slope.up = true;
          }
          if (player.x >= gold.x - 17 && !gold.mined) {
            player.speed = 0;
            time -= 1;
          }
          if (time <= 0) {
            stat();
            time = 50;
            gold.health -= player.weaponATK;
          }
          if (gold.health == 0) {
            player.speed = 3;
            gold.mined = true;
          }
          console.log("Gold Health: " + gold.health);
          console.log("ATK: " + player.ATK);
          console.log("Time: " + time);
          requestAnimationFrame(draw)
        }
      }
      requestAnimationFrame(draw)
    }
    window.setInterval(
        function() {
          document.getElementById('numberOfCoins').innerHTML = 'You got ' + currency.coins + ' coins!';
          document.getElementById('numberOfGolds').innerHTML = 'You mined ' + currency.golds + ' golds!';
          document.getElementById('numberOfCoals').innerHTML = resources.coals;
          document.getElementById('numberOfSilvers').innerHTML = resources.silvers;
          document.getElementById('numberOfIrons').innerHTML = resources.irons;
          document.getElementById('numberOfDiamonds').innerHTML = resources.diamonds;               

Так вот моя проблема. В части Javascript, в начале, я объявляю player.ATK = 0. Но вниз в функции start(). Когда я console.log() выдает player.ATK, он возвращает undefined. Если я console.log() это функция или внутри консоли, она обычно возвращает переменную. Кто-нибудь может мне с этим помочь? Можно ли это решить, используя только Javascript?
Спасибо!

  • 0
    Можете ли вы сократить код, чтобы показать соответствующие части, но указать общую структуру? Например, я заметил, что у вас есть тег сценария и тег стиля ПОСЛЕ </ html>, который не является семантически правильным.
  • 2
    Вы объявили новую переменную player в функции start() с var player = { x: 0, y: 198, speed: 3 }; , В этом объекте нет свойства ATK .
Показать ещё 1 комментарий
Теги:
function
variables

1 ответ

1
Лучший ответ

Функция start() определяет локальный игрок var:

 function start(place) {
      if (place == 'goldMine') {
        canvas = document.getElementById('canvas');
        ctx = canvas.getContext('2d');
        var player = { // <<-- Here
          x: 0,
          y: 198,
          speed: 3
        };

Это эффективно скрывает глобальную переменную игрока из этой области. У этого нового игрока var нет свойства ATK, поэтому он не определен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню