Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 调用我的函数,但每次调用后未保存内部数组?_Javascript - Fatal编程技术网

Javascript 调用我的函数,但每次调用后未保存内部数组?

Javascript 调用我的函数,但每次调用后未保存内部数组?,javascript,Javascript,我创建了一个项目来检查数组以更新汽车收藏,但遇到了一个我无法解释的问题。我对JS还比较陌生,但仍在摸索方向 我的代码工作得很好,因为它只在调用函数一次时提供我想要看到的结果。它应该取一辆不属于我的carsOwned数组的车,将其转储到carsWanted中,然后显示carsWanted数组 如果我调用我的函数一次,它将正确地完成所有这一切。但是,如果我使用另一辆不属于carsOwned数组的车辆再次调用该函数。就好像我从来没有第一次调用过我的函数一样,似乎数组在每次执行后都会被清除 functi

我创建了一个项目来检查数组以更新汽车收藏,但遇到了一个我无法解释的问题。我对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");

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

否则,每次调用函数时,
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" ]

您遇到的问题是由于您声明carsWanted数组的方式造成的。通过在updateCarCollection函数中声明它,您已经将变量的作用域限定到该函数()。一个简单的想法是这样的:您的carsWanted数组在updateCarCollection中诞生、存在和消亡。每次运行updateCarCollection方法时,它都会重新创建carsWanted数组并将其重新初始化为空数组。它不知道您之前对carsWanted数组做了什么,因为在您之前对updateCarCollection的调用完成后,carsWanted数组“死亡”

在这里,您要做的是通过将变量移出updateCartCollection方法以不同的方式定义变量的范围。因此,您只需将代码更新为以下内容:

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

如果(并且仅当)您不打算修改该数组,我还建议将carsOwned转换为const

使用可以引用的对象
let
只创建一个局部函数,当它声明的作用域(在函数中)消失(您“离开”函数)时,它就消失了

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

var myCarThings={
车载:[“兰博基尼安万塔多”、“法拉利488”、“宾利大陆”、“奥迪RS7”],
Carswand:[],
updateCarCollection:函数(新车){
if(此.carsOwned.indexOf(新车)=-1){
如果(此.carsWanted.indexOf(新车)=-1){
这辆车。车。推(新车);
log(“我还没有这辆车,但我把它添加到了我想要的车上:”,newCar);
}否则{
log(“我已经说过我想要:”,新车);
}
}否则(此.carsOwned.indexOf(新车)>-1){
log(“这辆车已经是我收藏的一部分:”,newCar);
}
console.log(这个是carsWanted);
}
};
myCarThings.UpdateCollection(“法拉利428”);
//即使我第一次调用它,如果我从未第一次调用该函数,它也会表现为ad
myCarThings.updateCarCollection(“Spyder 718”);
myCarThings.UpdateCalCollection(“宾利大陆”);
//直接放一个进去
myCarThings.carsWanted.push(“我的新吉普车”);
//说我想再要一次

myCarThings.updateCarCollection(“My New Jeeper”);
因为每次调用函数时都是从头开始重新创建数组。
让carsWanted=[]
几乎是您要做的第一件事。另一个您应该注意的问题是,Javascript对除对象以外的所有对象都是按引用传递的。因此,如果您将
carsWanted
作为参数传递给函数,您仍然无法获得预期的行为。@Hemium_1s2我想您想对除原语之外的所有对象说
nd不适用于除对象以外的所有对象。
。是的,我正在讨论将其措辞为“除原语以外的所有对象均按引用传递”和“除对象以外的所有对象均按值传递”,并不知何故使用了每种语言的一半:)@Hemium_1s2,您应该注意措辞
按引用传递
(或者-我知道这是关于Java的,但仍然是相同的论点-)哇。非常感谢你这样解释它,你陈述它的方式更有意义。我现在可以把我的头绕在这个逻辑上了。非常感谢,除了你的回答,我还让人给我解释了,现在我可以绕着它转了。