【问题标题】:JavaScript setting value to variable properties on a function callJavaScript 将值设置为函数调用上的变量属性
【发布时间】:2019-05-09 23:55:17
【问题描述】:

我发现有这两种方法可以在函数调用上更新变量属性值

示例 1:

function bar( arg ) {
  return arg + 1;
}

var foo = {
  num: 1
};

foo.num = bar( foo.num );
console.log( foo.num );

示例 2:

function bar( arg ) {
  arg.num = arg.num + 1;
}

var foo = {
  num: 1
};

bar( foo );
console.log( foo.num );

我想知道每个方法调用的正确命名约定是什么。

还有谁能解释一下,如何在示例 2 所示的封闭函数操作中更新原始变量值?

【问题讨论】:

  • 嗯,这是因为对象是作为引用传递的,所以你可以从一个封闭的函数中更新。

标签: javascript function variables pass-by-reference pass-by-value


【解决方案1】:

原始参数(例如数字)通过以下方式传递给函数 价值;值被传递给函数,但如果函数 更改参数的值,此更改不反映 全局或在调用函数中。

如果您传递一个对象(即非原始值,例如 Array 或 用户定义的对象)作为参数,函数改变 对象的属性,该更改在函数外部可见。 来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions

在 javascript 中 objectsreference 传递,因此当您将对象传递给函数时,您传递的是 memory reference 而不是 copy。 因此,当您更新函数中的值时,它会更新引用处的值。

function bar(arg) {
  arg.num = arg.num + 1;
}

var foo = {
  num: 1
};

bar(foo);
console.log(foo.num);

当您传递 primitive value 时,它会被 value 传递。它传递了一个copy 的值,因此您在关闭函数中所做的任何更改都不会影响原始值。

function bar(arg) {
  arg = arg + 1;
}

var foo = 1

bar(foo);
console.log(foo);

【讨论】:

    【解决方案2】:

    我想知道每种方法的正确命名约定是什么。

    函数没有命名约定(如果它们直接与对象相关联,我只会称它们为方法),除了名称是驼峰式。然而,函数式编程中有一个约定,即返回某些东西的函数是 pure (它们不会改变任何东西,只是返回一些新的东西,就像你的第一个函数一样),而什么都不返回的函数是 不纯的,他们改变了一些东西。您是否严格遵循该模式取决于您的编码风格,我经常但并非总是遵循。在 JS 中也有点难,因为 JS 没有类型。

    任何人都可以解释一下,如示例 2 所示,如何在封闭函数操作中更新原始变量值?

    这是不可能的。如果您传递一个数字,它作为一个值传递,您无法找出该数字所属的位置。这是一件好事,因为您可以随时跟踪哪个函数能够改变对象。 bar(foo) 是,bar(foo.num) 不是。

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多