JavaScript 将值设置为函数调用上的变量属性
Posted
技术标签:
【中文标题】JavaScript 将值设置为函数调用上的变量属性【英文标题】:JavaScript setting value to variable properties on a function call 【发布时间】: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 所示的封闭函数操作中更新原始变量值?
【问题讨论】:
嗯,这是因为对象是作为引用传递的,所以你可以从一个封闭的函数中更新。 【参考方案1】:原始参数(例如数字)通过以下方式传递给函数 价值;值被传递给函数,但如果函数 更改参数的值,此更改不反映 全局或在调用函数中。
如果您传递一个对象(即非原始值,例如 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);
【讨论】:
【参考方案2】:我想知道每种方法的正确命名约定是什么。
函数没有命名约定(如果它们直接与对象相关联,我只会称它们为方法),除了名称是驼峰式。然而,函数式编程中有一个约定,即返回某些东西的函数是 pure (它们不会改变任何东西,只是返回一些新的东西,就像你的第一个函数一样),而什么都不返回的函数是 不纯的,他们改变了一些东西。您是否严格遵循该模式取决于您的编码风格,我经常但并非总是遵循。在 JS 中也有点难,因为 JS 没有类型。
任何人都可以解释一下,如示例 2 所示,如何在封闭函数操作中更新原始变量值?
这是不可能的。如果您传递一个数字,它作为一个值传递,您无法找出该数字所属的位置。这是一件好事,因为您可以随时跟踪哪个函数能够改变对象。 bar(foo)
是,bar(foo.num)
不是。
【讨论】:
以上是关于JavaScript 将值设置为函数调用上的变量属性的主要内容,如果未能解决你的问题,请参考以下文章
如何将值从javascript传递到iOS UIWebView