首页 新闻 会员 周边 捐助

请大神帮我分析一下这个闭包问题

0
[已解决问题] 解决于 2018-10-22 11:11

var arr=[1,2,3,4];
function foo(arr){
arr[0]=0;
arr=0;
arr[0]=100;
return arr;
}
res=foo(arr);
console.log(arr);
console.log(res);
结果是://[0,2,3,4]
//[100]

为什么arr第一个值变成了0?
看代码感觉要么不变,要变也变成100的啊。
谢谢求解答!

烫烫烫的菜鸟的主页 烫烫烫的菜鸟 | 菜鸟二级 | 园豆:201
提问于:2017-12-14 23:25
< >
分享
最佳答案
1

你好,这牵涉到变量作用域的问题,你在函数内部的arr都没有用var声明,而是修改了全局变量arr,执行函数后改变了原有的赋值 。 arr = 0 后他在函数内已经不再是数组了

奖励园豆:5
OkayChen | 菜鸟二级 |园豆:207 | 2017-12-15 09:57

那为什么只有函数内第一个arr改变了原数组,而后面的没有覆盖呢?因为第二个arr其实不是数组,所以就不会影响吗?

烫烫烫的菜鸟 | 园豆:201 (菜鸟二级) | 2017-12-15 18:43

@烫烫烫的菜鸟:  

我建议你在 arr = 0 这一步后面,加上下面这句测试代码

console.log(arr.__proto__.constructor)

或者是

console.log(arr instanceof Array)

你会发现,在函数内arr = 0 后,函数内它已经不在是数组了,而是Number类型,所以在同一个函数域内你在让arr[0] = 100没有意义了已经

OkayChen | 园豆:207 (菜鸟二级) | 2017-12-15 19:48

@OkayChen 明白了大神

烫烫烫的菜鸟 | 园豆:201 (菜鸟二级) | 2017-12-16 10:34
其他回答(1)
1

js是动态类型语言,你foo函数中,arr=0语句之后的arr和外面的arr变量没有关系。

授之以渔 | 园豆:1107 (小虾三级) | 2017-12-15 08:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册