任何人都可以告诉我为什么会记录11
,而不是9
?
function foo() {
function bar(a) {
i =3;
console.log( a + i );
}
for (var i=0; i<10; i++) {
bar( i *2 );
//I know, infinite loop
}
}
foo();
如果i
中的bar(){}
是硬编码的,那么记录的结果不应该是9吗?
这是Scope类的一部分,我迷失了。
感谢。
答案 0 :(得分:6)
在第一次迭代中,i
为0
,小于10
。 0
(2 * i
)已作为a
传递给bar
。 i
设置为3
,然后总和为3
。
在下一次迭代中,i
会增加到4
(仍小于10
),然后8
(2 * i
)将传递为a
到bar
。 i
重置为3
,然后总和为11
。
下一次迭代是相同的,i
再次从3
增加到4
,依此类推。
您的误解似乎是a
的价值没有变化,因为i
发生了变化,首先评估乘法。或者您刚刚错过了循环标题中的i++
语句。
答案 1 :(得分:1)
@Bergi有正确的答案,我只是想稍微扩展一下。对于字符串或数字等基本类型,参数按值传递。在这里,你将我作为值a传递给bar。对i或a的任何更改都不会影响其他值。这也不会给你一个无限循环,因为在这种情况下i的值是[0,4,5,6,7,8,9]
现在,如果我被包裹在传递给foo的对象内部,那么你会遇到问题。传递给javascript函数的对象通过引用传递,因此对bar中对象的更改也会在foo中发生。