Javascript 参数传递:输入和输出
考虑: 基本数据类型在JavaScript中按值传递。这意味着 将变量传递给 函数,因此该函数的任何局部操作都会离开 未触及原始变量Javascript 参数传递:输入和输出,javascript,Javascript,考虑: 基本数据类型在JavaScript中按值传递。这意味着 将变量传递给 函数,因此该函数的任何局部操作都会离开 未触及原始变量 函数小提琴(arg1){ arg1=“摆弄”; console.log(“在函数fiddle str=“+arg1+””); } var str=“原始值”; log(“函数调用前str=“+str+””; 小提琴(str); log(“函数调用str=“+str+””)之后; 简单 组合类型,如数组和对象(如果使用),将传递它们 通过引用而不是价值 考虑以下
函数小提琴(arg1){
arg1=“摆弄”;
console.log(“在函数fiddle str=“+arg1+”
”);
}
var str=“原始值”;
log(“函数调用前str=“+str+”
”;
小提琴(str);
log(“函数调用str=“+str+”
”)之后;
简单
组合类型,如数组和对象(如果使用),将传递它们
通过引用而不是价值
考虑以下修改
在上一个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>");
函数小提琴(arg1){
arg1[0]=“摆弄”;
console.log(“在函数fiddle arg1=“+arg1+”
”);
}
var arr=[“原件”、“原件”、“原件”];
console.log(“函数调用前arr=“+arr+”
”;
小提琴(arr);
console.log(“函数调用后arr=“+arr+”
”;
在这里之前都很好
从这里我发现自己很困惑
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?
函数小提琴(arg1){
arg1=[“爆炸!”,“爆炸!”];
console.log(“在函数fiddle arg1=“+arg1+”
”);
}
var arr=[“原件”、“原件”、“原件”];
console.log(“函数调用前arr=“+arr+”
”;
小提琴(arr);
console.log(“函数调用后arr=“+arr+”
”);//为什么这一点没有改变?
有什么建议吗?可以说吗
组合类型,如数组和对象(如果使用),将传递它们
通过引用而不是价值
同样在这种情况下?似乎很清楚,在
fiddle
内部,您正在使用您当场创建的数组覆盖对arr
的引用。您从未通过引用接触过arr
本身,只是引用,因此,一旦您再次外出,arr
仍然是原始数组。这是因为括号表示法(用于数组)或点表示法(用于对象)允许您在数组/对象中变异对象,即使“父”对象是按值传递的,当它们通过引用传递时,也会向上和向外传播函数的范围。此功能称为。简言之:
- 一切都是通过价值传递的,但是
- “everything”(如果存在,即数组和对象)中的对象通过引用传递
fiddle()
函数的范围之外修改arr
,则必须返回它,即:returnarr1
然后分配arr=fiddle(arg1[,arg2,…])
,如下所示:
函数小提琴(arg1){
arg1=[“爆炸!”,“爆炸!”];
$('body').append(“函数中的fiddle arg1=“+arg1+”
”);
返回arg1;
}
var arr=[“原件”、“原件”、“原件”];
$('body').append(“函数调用前arr=“+arr+”
”);
arr=小提琴(arr);
$('body').append(“函数调用后arr=“+arr+”
”);//为什么这一点没有改变?
如果执行arg1.push(“Blasted!”,“Blasted!”),则可能存在重复的
然后对原始对象进行更改,但您正在使用arg1=[]
在fiddle中创建一个新数组。指定名称与更改名称所引用的对象不同。前者仅更改名称绑定。后者是目标。谢谢你的回答,特里。@盲目地:我感谢你的回答。
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?