Возникли проблемы при изменении глобальной переменной из функции (javascript). Как я могу изменить cardValue? - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь собрать колоду игральных карт. вот короткий код для этого. Я просто пытаюсь учиться, поэтому будьте осторожны с моим кодом.

Итак, я хочу создать общее значение для карт в руке игрока. каждый раз, когда я пытаюсь вызвать эту функцию, чтобы изменить cardValue, она, похоже, ничего не меняет в глобальной области видимости.

let cardValue = 0;
let cardDeck = [];

for (i=1; 52 >= i; i++) {
    cardDeck.push(i);
};

let card1 = ((Math.random()*52)-1);
card1 = Math.floor(card1);
card1 = cardDeck.splice(card1, 1);

let card2 = ((Math.random()*51)-1);
card2 = Math.floor(card2);
card2 = cardDeck.splice(card2, 1);

function cardTotal(foo, bar) {

    if (3 >= foo) {
        bar =+ 11;
    } else if (7 >= foo) {
        bar =+ 2;
    } else if (11 >= foo) {
        bar =+ 3;
    } else if (15 >= foo) {
        bar =+ 4;
    } else if (19 >= foo) {
        bar =+ 5;
    } else if (23 >= foo) {
        bar =+ 6;
    } else if (27 >= foo) {
        bar =+ 7;
    } else if (31 >= foo) {
        bar =+ 8;
    } else if (35 >= foo) {
        bar =+ 9;
    } else if (39 >= foo) {
        bar =+ 10;
    } else if (43 >= foo) {
        bar =+ 10;
    } else if (47 >= foo) {
        bar =+ 10;
    } else {
        bar =+ 10;
    }

}

cardTotal(card1, cardValue);
cardTotal(card2, cardValue);
console.log(cardValue); // returns 0

1 Ответ

0 голосов
/ 30 января 2020

JavaScript функции получают примитивы по значению, а не по ссылке. Когда ваша функция cardTotal получает значение bar в качестве одного из аргументов, попадание в один из ваших блоков else просто меняет локальное значение cardTotal на bar; но помните, поскольку это примитив (number), он был передан по значению, поэтому функция имеет только значение cardValue, а не ссылку на него.

Немного лучше: внутри cardTotal , принять только один аргумент (card1 или card2) и напрямую изменить cardValue из функции, то есть:

  if (3 >= foo) {
    cardTotal += 11; // Add 11 to cardTotal
  } else {
  ...

Даже лучше: cardTotal вернуть значение в конце этого Таким образом, cardTotal по-прежнему принимает два значения. Измените его локальное значение внутри области функции, а затем return, чтобы это значение вернулось из функции.

Итак, последняя строка cardTotal должна быть return bar;

Тогда последняя пара строк вашего кода может быть изменена на:

cardValue = cardTotal(card1, cardValue);
console.log(cardValue);
cardValue = cardTotal(card2, cardValue);
console.log(cardValue);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...