我发现有两种方法可以在函数调用中更新变量属性值
示例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所示,如何在封闭函数操作中更新原始变量值?
答案 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)
不是。