参数传递:进出

时间:2015-09-12 19:50:02

标签: javascript

考虑:

  

原始数据类型在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>");

enter image description here

EASY

  

复合类型(如数组和对象,如果使用),它们将被传递   通过参考而不是价值

考虑以下修改 之前的小提琴()函数:

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>");

enter image description here

直到这里

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

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?

enter image description here

有什么建议吗?可以说

  

复合类型(如数组和对象,如果使用),它们将被传递       通过参考而不是价值

在这种情况下呢?

2 个答案:

答案 0 :(得分:1)

看起来非常清楚,在fiddle内你用现场创建的数组覆盖对arr的引用。您从未通过引用触及arr本身,只引用了引用,因此一旦您再次出现在外,arr仍然是原始数组。

答案 1 :(得分:1)

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

  • 所有内容都按值传递, ...
  • &#34;所有内容中的对象&#34; (如果存在,即对于数组和对象)通过引用传递

如果您要修改arr功能范围之外的fiddle(),则必须将其返回,即:return arr1;然后分配arr = fiddle(arg1[,arg2,...]),如如下:

&#13;
&#13;
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?
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;