我认为Arrays是对象所以当我执行这行代码时,我期望获得[3,3,3]
,因为我改变了数组。但是我得到了[2,4,6]
var arr = [2,4,6];
function checkArr(arr){
arr = [3,3,3];
}
console.log(arr)
如果我添加一个return语句,那么我会得到我期待的值。我想知道为什么在执行函数时给arr一个新值时需要返回。
var arr = [2,4,6];
function checkArr(arr){
arr = [3,3,3];
return arr;
}
console.log(arr)
最后,在此for
循环期间,我不使用return
,并且数组值已更改!我有点困惑。为什么第一个示例没有更改arr
的值?
var arr = [2,4,6];
function checkArr(arr){
for(var i = 0; i<arr.length; i++){
arr[i] = 3
}
}
console.log(arr)
答案 0 :(得分:5)
您未在示例中测试传递引用和传值之间的差异。您实际上正在测试 变量范围 。
对于有关Javascript按值传递VS传递引用here is an answer on stack already的问题的一个很好的答案。
在函数内声明(创建)的变量是 local 到该函数。这适用于在函数和函数中使用var
关键字声明的任何变量。
函数外部声明的变量可以在函数中访问,如果它没有得到相同的名称声明的变量。
示例1:
var arr = [2,4,6]; ------------------
|
function checkArr(arr){ |
// paramter means that a local |
// variable 'arr' created inside |
// function, so refers to value |
// passed as argument or undefined |
|
arr = [3,3,3]; |
} |---- you're loggin this variable,
| the one inside the funciton is
var check = checkArr(arr); |
| function and eny enclosing child functions
console.log(arr) <------------------ (for the life of the function)
如果我们将参数名称更改为其他名称,行为就会变得更加明显:
var arr = [2,4,6]; function checkArr(ref){ ref = [3,3,3]; } checkArr(arr);
调用该函数时,会创建并设置本地值
ref
参考arr
的参考。 接下来的行,然后 将覆盖ref的值 数组文字arr
的实际值[3,3,3]
。function checkArr(){ var ref = REFERENCE_TO_ARRAY_PASSED_IN; ref = [3,3,3]; // REFERENCE to 'arr' OVERWRITTEN by Array literal // global 'arr' remains unaffected }
示例2:
var arr = [2,4,6];
function checkArr(arr){
arr = [3,3,3];
return arr;
}
console.log(arr);
// this should log out [2, 4, 6] since you're not even invoking checkArr...
示例3:
var arr = [2,4,6];
function checkArr(arr){
// same as first example
// a local variable 'arr' is created
// from the parameter 'arr'
// this for loop won't even run
// if 'arr' isn't passed in as an argument
// it'll fail on the first condition
for(var i = 0; i<arr.length; i++){
arr[i] = 3
}
}
// the arr variable INSIDE the function is not available here
console.log(arr) // logs out [2, 4, 6]
// this function refers to the variable declared above the function definition, again you haven't even invoked the funciton 'checkArr'
// thought even if you did, it would not change the console.lout ouptput
从功能定义中删除参数
var arr = [2,4,6];
function checkArr(){
// no local variable or parameter is defined here
// but function has access to it's enclosing scope
// where there IS a variable 'arr'
arr = [3,3,3]
}
var check = checkArr();
console.log(arr);
// logs out [3,3,3]
现在调用该函数时,您将改变数组,因为该函数将查找变量&#39; arr&#39;在本地,当它没有找到它时,它会查看它的封闭范围,在这种情况下,它是全局范围,它会找到变量arr
并将其变异