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 中 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) 不是。

【讨论】:

以上是关于JavaScript 将值设置为函数调用上的变量属性的主要内容,如果未能解决你的问题,请参考以下文章

将值从 SpinBox 设置为变量

如何将值从javascript传递到iOS UIWebView

如何将值从 javascript 传递到 iOS UIWebView

如何将值设置为类的变量并显示它?

asp.net里面的javascript没有设置隐藏字段值

关于Javascript闭包的理解