【问题标题】:How do I keep track of a variable's value when it's passed into a function?当变量传递给函数时,如何跟踪变量的值?
【发布时间】:2018-10-06 12:31:42
【问题描述】:

当变量被传递给函数时,JavaScript 是否提供了一种方法来跟踪变量的身份? 例如:

var dog = 0;

function dogStuff(animal){
  animal = animal++;
}

在这个例子中,我想通过将 dog 传递给函数来使 dog == 1:

dogStuff(dog);

这样

console.log(dog);

将打印 1. 人们已将此标记为与其他几个问题重复,但对于我这个初学者来说,这些问题有点太复杂了,无法理解。我需要一些回应,假设我对 JS 知之甚少。

【问题讨论】:

标签: javascript variables


【解决方案1】:

第一件事:animal = animal++ 行不会做任何事情,因为它是一个后缀增量。要么只做animal++++animal 来增加它。


不,dog 不会更改。 JavaScript passes primitives by value(感谢@ASDFGerte 的更正)。

var dog = 0;
function dogStuff(animal) {
  animal++;
}
dogStuff(dog);
console.log(dog);  // prints 0

您想要做的(可能)类似于@alfasin 提到的:返回更新后的狗值。

var dog = 0;
function dogStuff(animal) {
  animal++;
  return animal;
}
dog = dogStuff(dog);
console.log(dog);  // prints 1

但是,如果您传递一个对象并重新分配其属性,则原始对象将被修改(almost like pass by reference):

var dog = { age: 0 };
function incrementAge(animal) {
  animal.age++;
}
incrementAge(dog);
console.log(dog.age);  // prints 1

编辑:如果您想在返回时分配多个变量,一种可能的方法是返回一个变量数组,然后可以使用deconstructed assignment 进行分配:

var dog = 0;
var cat = 52;
function incrementTwoAnimals(animal1, animal2) {
  animal1++;
  animal2++;
  return [animal1, animal2];
}
[dog, cat] = incrementTwoAnimals(dog, cat);  // deconstructed assignment
console.log(dog, cat);  // prints 1, 53

【讨论】:

  • 嗯,“重新分配其属性”是什么意思?
  • @ASDFGerte 哎呀,我的意思是按价值传递。固定
  • 请注意,它是“原始值通过值传递”,对象又是另一回事,有时被描述为“通过引用的副本传递”
  • @JonathanLam 谢谢!如果我需要一个具有多个参数的函数并且我的程序有多个变量,例如 dogStuff(animal1, animal2) 和变量 dog、cat,该怎么办?如果在特定情况下该函数仅更新两个变量之一的值,我如何告诉计算机要更改哪个变量并返回。就像 dogStuff(cat,dog) 只做animal1++而不做animal 2++一样,我如何让它用return更新cat?
  • @Christoph 我很高兴这有帮助!我将添加一个关于如何使用 return 进行多重分配的编辑
【解决方案2】:

您发布的函数没有返回任何可以在它之外使用的值。所以你需要添加:return。这意味着当您运行 dogStuff(...) 时,它实际上会返回一个值。然后将该值保存在一个变量中,该变量可以是您作为参数传递的同一只狗。

这是完整的代码:

var dog = 0;

function dogStuff(animal){
   return animal++;
}

dog = dogStuff(dog);

【讨论】:

    猜你喜欢
    • 2020-12-20
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多