代码之家  ›  专栏  ›  技术社区  ›  isnvi23h4

JavaScript在函数调用中将值设置为变量属性

  •  2
  • isnvi23h4  · 技术社区  · 6 年前

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

    例1:

    function bar( arg ) {
      return arg + 1;
    }
    
    var foo = {
      num: 1
    };
    
    foo.num = bar( foo.num );
    console.log( foo.num );

    function bar( arg ) {
      arg.num = arg.num + 1;
    }
    
    var foo = {
      num: 1
    };
    
    bar( foo );
    console.log( foo.num );

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

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Community CDub    4 年前

    基元参数(如数字)通过

    如果传递对象(即非基本值,如数组或 用户定义的对象)作为参数,函数会更改 对象的属性,该更改在函数外部可见。 资料来源: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions

    objects 路过 reference 所以当你把一个对象传递给一个函数时,你传递的是 memory reference 不是 copy . 因此,当您更新函数中的值时,它会更新引用处的值。

    function bar(arg) {
      arg.num = arg.num + 1;
    }
    
    var foo = {
      num: 1
    };
    
    bar(foo);
    console.log(foo.num);

    当你经过一个 primitive value 路过 value 复制 因此,在关闭函数中所做的任何更改都不会影响原始值。

    function bar(arg) {
      arg = arg + 1;
    }
    
    var foo = 1
    
    bar(foo);
    console.log(foo);
        2
  •  0
  •   Jonas Wilms    6 年前

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

    没有命名约定 (我只会打电话给他们 方法 如果它们直接与对象关联),则名称为camelCase。然而,函数式编程中有一个惯例,即返回某些内容的函数是 纯净的 (它们不改变任何内容,只返回一些新的内容,比如第一个函数),而不返回任何内容的函数是 不纯 ,他们改变了一些东西。你是否严格遵循这种模式取决于你的编码方式,我经常遵循,但并不总是这样。在JS中这也有点困难,因为JS不是类型化的。

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