我创建了一个项目来检查数组以更新汽车收藏,并遇到了一个我无法解释的问题。我是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");
答案 0 :(得分:0)
您必须在函数之外声明变量。
否则,每次调用函数carsWanted
和carsOwned
都会重置为其初始值。
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");