考虑:
原始数据类型在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>");
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>");
直到这里
从这里我发现自己很困惑,
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?
有什么建议吗?可以说
复合类型(如数组和对象,如果使用),它们将被传递 通过参考而不是价值
在这种情况下呢?
答案 0 :(得分:1)
看起来非常清楚,在fiddle
内你用现场创建的数组覆盖对arr
的引用。您从未通过引用触及arr
本身,只引用了引用,因此一旦您再次出现在外,arr
仍然是原始数组。
答案 1 :(得分:1)
这是因为括号表示法(用于数组)或点符号(用于对象)允许您改变数组/对象中的对象,这些对象将在通过引用传递时向上和向外传播函数的范围,即使&#34;父母&#34; object按值传递。此功能称为call-by-sharing, as addressed in a previous question。简而言之:
如果您要修改arr
功能范围之外的fiddle()
,则必须将其返回,即: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?
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;