Почему метод my в разных объектах JS дает одинаковые результаты? - PullRequest
0 голосов
/ 17 января 2019

Я изучаю Javascript, поэтому любая помощь здесь будет оценена. В следующем фрагменте кода я создал два объекта johnTip и markTip, которые вычисляют сводку чаевых Джона и Марка. Метод tipCalculator реализован одинаково для обоих объектов. Однако после вызова markTip.calcTip () я обнаружил, что tipsJohn будет переопределен tipsMark, т. Е. Они имеют одинаковые значения. Кто-нибудь знает, что не так за кулисами и как это исправить? Спасибо.

Я пытался изменить порядок вызова этого метода на johnTip и markTip, но не исправил ошибку.

Ожидаемые результаты будут заключаться в том, что tipsJohn и tipsMark являются отдельными объектами (массивами). Тем не менее, похоже, что после вызова markTip.calcTip они имеют одинаковые значения.

var johnTip = {
  bills: [124, 48, 268, 180, 42],
  calcTip: function() {
    tips = [];
    finalBills = [];
    for (var i = 0; i < this.bills.length; i++) {
      if (this.bills[i] < 50) {
        tips[i] = this.bills[i] * 0.2;
      } else if (this.bills[i] < 200) {
        tips[i] = this.bills[i] * 0.15;
      } else {
        tips[i] = this.bills[i] * 0.1;
      }
      finalBills[i] = tips[i] + this.bills[i];
    }

    return [tips, finalBills];
  }
}

var markTip = {
  bills: [77, 375, 110, 45],
  calcTip: function() {
    tips = [];
    finalBills = [];
    for (var i = 0; i < this.bills.length; i++) {
      if (this.bills[i] < 100) {
        tips[i] = this.bills[i] * 0.2;
      } else if (this.bills[i] < 300) {
        tips[i] = this.bills[i] * 0.10;
      } else {
        tips[i] = this.bills[i] * 0.25;
      }
      finalBills[i] = tips[i] + this.bills[i];
    }

    return [tips, finalBills];
  }
}

let [tipsJohn, finalBillsJohn] = johnTip.calcTip();
let [tipsMark, finalBillsMark] = markTip.calcTip();
console.log('Mark\'s tip summary: ' + tipsMark);
console.log('Mark\'s final bills paid: ' + finalBillsMark);
console.log('John\'s tip summary: ' + tipsJohn);
console.log('John\'s final bills paid: ' + finalBillsJohn);

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Когда вы присваиваете переменную без ее удаления, она имеет глобальную область видимости.

x = 5;

Создает глобальную переменную.

let x = 5;

Создает переменную, которая имеет область видимости только для текущего блока.

Измените оба ваших массива на

let tips = [];

let finalBills = [];

И они будут разными массивами.

0 голосов
/ 17 января 2019

Вы объявили var finalBills; вне объявления markTip и johnTip. Вам нужно хранить их в разных var.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...