调用我的函数,但每次调用后都不会保存内部数组吗?

时间:2018-06-27 16:32:09

标签: javascript

我创建了一个项目来检查数组以更新汽车收藏,并遇到了一个我无法解释的问题。我是JS的新手,但仍然对我有所了解。

我的代码工作正常,因为它给了我仅当我调用一次函数后才希望看到的结果。应该将不属于我的carsOwned数组的一部分的汽车放到carsWanted中,然后显示carsWanted数组。

如果我一次调用函数,它将正确完成所有这些操作。但是,如果我第二次使用不属于carsOwned数组的一部分的车辆调用该函数。好像我第一次从未调用过函数,似乎每次执行后都会清除该数组。

function updateCarCollection(cars) {
  let carsOwned = ["Lamborghini Aventador", "Ferrari 488", "Bentley Continental", "Audi RS7"]
  let carsWanted = []

  if (carsOwned.indexOf(cars) === -1) {
    carsWanted.push(cars);
    console.log("I don't have this car yet, but I added it to the cars I want.");
  } else if (carsOwned.indexOf(cars) > -1) {
    console.log("This car is already part of my collection");
  }

  console.log(carsWanted);
}

updateCarCollection("Ferrari 428");

//even though I called it the first time it will behave ad if I never called the function the first time  

updateCarCollection("Spyder 718");

3 个答案:

答案 0 :(得分:0)

您必须在函数之外声明变量。

否则,每次调用函数carsWantedcarsOwned都会重置为其初始值。

let carsOwned = ["Lamborghini Aventador", "Ferrari 488", "Bentley Continental", "Audi RS7"]
let carsWanted = []

function updateCarCollection(cars) {
  if (carsOwned.indexOf(cars) === -1) {
    carsWanted.push(cars);
    console.log("I don't have this car yet, but I added it to the cars I want.");
  } else if (carsOwned.indexOf(cars) > -1) {
    console.log("This car is already part of my collection");
  }

  console.log(carsWanted);
}

updateCarCollection("Ferrari 428");
// [ "Ferrari 428" ]

updateCarCollection("Spyder 718");
// [ "Ferrari 428", "Spyder 718" ]

答案 1 :(得分:0)

您遇到的问题是由于您声明了carsWanted数组的方式所致。通过在updateCarCollection函数中声明它,您已将变量的作用域限定为该函数(see this short article on MDN about scoping)。一个简单的思考方式是这样的:carsWanted数组在updateCarCollection中诞生,生存和死亡。每次运行updateCarCollection方法时,它都会重新创建并将carsWanted数组初始化为一个空数组。它与您之前对carsWanted数组所做的操作没有任何关系,因为一旦您对updateCarCollection的调用完成,carsWanted数组就会“死亡”。

您这里想要做的是通过将变量移出updateCartCollection方法来改变变量的范围。因此,您只需要将代码更新为以下内容:

let carsWanted = []
function updateCarCollection(cars) {
    // ...
}

我还建议将所拥有的carsOwn变成const IF(并且仅当您不想修改该数组时)。

答案 2 :(得分:0)

使用可以引用的对象。 let仅创建局部变量,并且在声明该变量的范围(在函数中)消失时消失(您可以“离开”该函数。

因此,让我们为两个数组创建一个“ holder”对象,并仅使用该对象来保存我们的函数-这样,它很好地位于myCarThings的“命名空间”中 请注意,函数中的this现在是指该myCarThings对象,因此在其中,我们可以用这种方式引用它,即this.carsOwned。现在,在将其添加到“所需”列表之前,我们可能还希望检查一下我们是否尚未这样做。我还添加了一个示例来说明这一点。

var myCarThings = {
  carsOwned: ["Lamborghini Aventador", "Ferrari 488", "Bentley Continental", "Audi RS7"],
  carsWanted: [],
  updateCarCollection: function(newCar) {
    if (this.carsOwned.indexOf(newCar) === -1) {
      if (this.carsWanted.indexOf(newCar) === -1) {
        this.carsWanted.push(newCar);
        console.log("I don't have this car yet, but I added it to the cars I want:", newCar);
      } else {
        console.log("I already said I want:", newCar);
      }
    } else if (this.carsOwned.indexOf(newCar) > -1) {
      console.log("This car is already part of my collection:", newCar);
    }
    console.log(this.carsWanted);
  }
};

myCarThings.updateCarCollection("Ferrari 428");

//even though I called it the first time it will behave ad if I never called the function the first time  

myCarThings.updateCarCollection("Spyder 718");
myCarThings.updateCarCollection("Bentley Continental");
// directly put one in
myCarThings.carsWanted.push("My New Jeeper");
// say I want it again
myCarThings.updateCarCollection("My New Jeeper");