为什么我的方法在不同的JS对象中产生的结果相同?

时间:2019-01-17 01:48:17

标签: javascript object methods

我正在学习Javascript,因此这里的任何帮助将不胜感激。在以下代码片段中,我创建了两个对象johnTip和markTip,它们计算John和Mark的技巧摘要。两个对象的方法tipCalculator的实现方式相同。但是,在调用markTip.calcTip()之后,我发现tipsJohn将被tipsMark覆盖,即它们具有相同的值。有谁知道幕后有什么问题以及如何解决这个问题?谢谢。

我尝试切换在johnTip和markTip上调用此方法的顺序,但没有解决该错误。

预期结果将是tipJohn和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 :(得分:0)

您在markTip和johnTip声明之外声明了var finalBills;。 您需要将它们存储在不同的var中。

答案 1 :(得分:0)

当您分配变量而不进行缩放时,它具有全局作用域。

x = 5;

创建一个全局变量。

let x = 5;

创建一个仅具有当前块作用域的变量。

将两个数组都更改为

let tips = [];

let finalBills = [];

它们将是不同的数组。