请在回答之前阅读整个问题。
我在看你不能在压力下做 JavaScript 测验,并得到了关于对数组中的值求和的问题。我编写了以下函数(最初没有 console.log 语句),它的行为与输入 [[1,2,3],4,5] 不一样 - 返回 10 而不是 15。最终我想出了如何修复它 - 在 n 和 sum 前面添加 var。我在 Firefox 的 Scratchpad 中调试时一直在执行此操作,在 Firebug 中查看控制台输出。
function arraySum(i) {
// i will be an array, containing integers, strings and/or arrays like itself.
// Sum all the integers you find, anywhere in the nest of arrays.
n=0;
sum=0;
console.log(i.length)
while(n<i.length){
console.log("i["+n+"]="+i[n]);
if(i[n].constructor==Array){
console.log("array n="+n)
sum+=arraySum(i[n]);
console.log("out array n="+n)
}
else if(typeof(i[n])=="number"){
console.log("number")
sum+= i[n];
}
n++;
console.log("sum="+sum+" n="+n)
}
return sum
}
console.log(arraySum([1,[1,2,3],2] ) );
输出是
start
Scratchpad/1 (line 9)
3
Scratchpad/1 (line 17)
i[0]=1
Scratchpad/1 (line 20)
number
Scratchpad/1 (line 28)
sum=1 n=1
Scratchpad/1 (line 33)
i[1]=1,2,3
Scratchpad/1 (line 20)
array n=1
Scratchpad/1 (line 23)
3
Scratchpad/1 (line 17)
i[0]=1
Scratchpad/1 (line 20)
number
Scratchpad/1 (line 28)
sum=1 n=1
Scratchpad/1 (line 33)
i[1]=2
Scratchpad/1 (line 20)
number
Scratchpad/1 (line 28)
sum=3 n=2
Scratchpad/1 (line 33)
i[2]=3
Scratchpad/1 (line 20)
number
Scratchpad/1 (line 28)
sum=6 n=3
Scratchpad/1 (line 33)
out array n=3
Scratchpad/1 (line 25)
sum=7 n=4
Scratchpad/1 (line 33)
7
所以最终我发现当函数被递归调用时,外部函数的 n 变量被重置为 0 并修改为 3,所以当它退出时,而不是再循环一次(如果 n 是 2 它将这样做)它离开功能。这一切都是有意义的,直到您考虑 sum 变量,它应该在相同的条件下:在递归调用中重置为 0,然后在退出函数的递归调用时结束为 6,
所以我的问题是:
为什么我得到 7 而不是 6?