考虑:
基本数据类型是在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
如果使用数组和对象等组合类型,则通过引用而不是值传递它们。
考虑一下对前一个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?

有什么建议吗?我可以说
如果使用数组和对象等组合类型,则通过引用而不是值传递它们。
在这种情况下?
发布于 2015-09-12 19:53:18
看起来很清楚,在fiddle内部,您正在用当场创建的数组覆盖对arr的引用。您从未通过它的引用(仅通过引用)接触过arr本身,因此,一旦您再次外出,arr仍然是原始数组。
发布于 2015-09-12 20:13:19
这是因为括号表示法(用于数组)或点表示法(对于对象)允许您在数组/对象中变异对象,即使“父”对象是通过值传递的,它们也会在函数的作用域上传播并向外传播。这个特性被称为, 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?<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
https://stackoverflow.com/questions/32543039
复制相似问题