JavaScript循环返回意外结果

时间:2016-06-16 14:57:10

标签: javascript scope infinite-loop

任何人都可以告诉我为什么会记录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类的一部分,我迷失了。

感谢。

2 个答案:

答案 0 :(得分:6)

在第一次迭代中,i0,小于1002 * i)已作为a传递给bari设置为3,然后总和为3

在下一次迭代中,i会增加到4(仍小于10),然后82 * i)将传递为abari重置为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中发生。