var arr=[1,2];
var arr0=[{a:1,b:2}];
function fun(data){
data = arr0
}
fun(arr);
console.log(arr) //[1,2]
问题:调用函数后arr的值不是应该改变的吗?为什么arr的值没有改变?
var arr=[1,2];
var arr0=[{a:1,b:2}];
function fun(data){
data = arr0
}
fun(arr);
console.log(arr) //[1,2]
问题:调用函数后arr的值不是应该改变的吗?为什么arr的值没有改变?
你有些地方写错了
var arr=[1,2];
var arr0=[{a:1,b:2}];
function fun(data){
data = arr0
return data
}
console.log(fun(arr)); // {a:1,b:2}
console.log(arr) //[1,2]
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
知识点三个:
1.形参和实参
2.函数作用域
3.值类型和引用类型
函数定义的时候,也就是你这里的data,是一个形参;函数调用时,也就是你这里传入的arr,是实参。
在函数执行时,会形成一个新的作用域,形参data就定义在新的作用域中, 传入的实参arr是一个赋值的操作,可以这样理解:
因为arr是引用类型,所以其实data和arr指向同一块堆内存。
而在函数内部,接着会执行赋值的操作:
arr0也是一个引用类型,所以此时,函数内部的data,又会将它的真实地址指向了另一块堆内存,也就是和arr0是同一块堆内存。
所以到这一步,其实逻辑是这样的:
1.data先是和arr指向同一块内存
2.data又和arr0指向同一块内存,此时data就和实参arr断了关系了。
所以函数执行完,其实不会影响实参arr。
所以,题主补充的,在函数内部,给data[0]等重新赋值,此时data和arr还是有关系的,所以会影响外面实参arr的值。