【问题标题】:Parameter Passing: In and Out参数传递:输入输出
【发布时间】:2015-12-09 04:05:07
【问题描述】:

考虑:

原始数据类型在 JavaScript 中按值传递。这意味着 当一个变量传递给一个变量时,它实际上是由一个副本组成 函数,因此该函数的任何本地操作都会离开 原始变量保持不变。

function fiddle(arg1) {
      arg1 = "Fiddled with";
      console.log("In function fiddle str = "+arg1+"<br>");
}
var str = "Original Value";
console.log("Before function call str = "+str+"<br>");
fiddle(str);
console.log("After function call str ="+str+"<br>");

简单

如果使用数组和对象等复合类型,则将它们传递 通过引用而不是值

考虑以下修改 之前的 fiddle() 函数:

function fiddle(arg1) {
       arg1[0] = "Fiddled with";
       console.log("In function fiddle arg1 = "+arg1+"<br>");
}
var arr = ["Original", " Original ", " Original "];
console.log("Before function call arr = "+arr+"<br>");
fiddle(arr);
console.log("After function call arr ="+arr+"<br>");

到此为止

从这里我发现自己真的很困惑,

function fiddle(arg1) {
      arg1 = ["Blasted!","Blasted!"];
      console.log("In function fiddle arg1 = "+arg1+"<br>");
}
var arr = ["Original", " Original ", " Original "];
console.log("Before function call arr = "+arr+"<br>");
fiddle(arr);
console.log("After function call arr ="+arr+"<br>"); // Why this hasn't changed?

有什么建议吗?而且可以说

如果使用数组和对象等复合类型,则将它们传递 通过引用而不是值

在这种情况下也是?

【问题讨论】:

标签: javascript


【解决方案1】:

看起来很清楚,在fiddle 中,您正在使用您当场创建的数组覆盖对arr 的引用。你从来没有通过它的引用触及arr 本身,只是引用,所以一旦你再次在外面,arr 仍然是原始数组。

【讨论】:

  • @Blindly:我很欣赏你的回答。
【解决方案2】:

这是因为括号表示法(用于数组)或点表示法(用于对象)允许您在数组/对象中改变对象,当它们通过引用传递时,这将向上和向外传播到函数的范围,即使“父”对象是按值传递的。此功能称为call-by-sharing, as addressed in a previous question。简而言之:

  • 一切都是按值传递的,但是...
  • “一切”中的对象(如果存在,即用于数组和对象)通过引用传递

如果你想在fiddle()函数的范围之外修改arr,你必须返回它,即:return arr1;然后赋值arr = fiddle(arg1[,arg2,...]),如下:

function fiddle(arg1) {
  arg1 = ["Blasted!","Blasted!"];
  $('body').append("In function fiddle arg1 = "+arg1+"<br>");
  return arg1;
}
var arr = ["Original", " Original ", " Original "];
$('body').append("Before function call arr = "+arr+"<br>");
arr = fiddle(arr);
$('body').append("After function call arr ="+arr+"<br>"); // Why this hasn't changed?
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 感谢您的回复,特里。
猜你喜欢
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多