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

时间:2018-12-08 12:49:27

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

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

示例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所示,如何在封闭函数操作中更新原始变量值?

2 个答案:

答案 0 :(得分:2)

  

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

     

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

JavaScript 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传递。它传递了copy值,因此您在关闭函数中所做的任何更改都不会影响原始值。

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

var foo = 1

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

答案 1 :(得分:0)

  

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

没有 function 的命名约定(如果它们直接与对象相关联,我只会将它们称为 methods ),除非名称是camelCase。但是,函数式编程中有一个约定,即返回 pure 的函数(它们不会改变任何东西,只是返回新的东西,例如您的第一个函数),而什么都不返回的函数是不纯,他们改变了一些东西。如果您严格遵循该模式取决于您的编码样式,那么我经常但并非总是遵循。由于未键入JS,因此在JS中也较难。

  

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

这是不可能的。如果传递数字,则将其作为值传递,您将无法找出该数字所属的位置。那是一件好事,因为您始终可以跟踪哪个功能可以使对象发生突变。 bar(foo)是,bar(foo.num)不是。