2017-07-29 125 views
-1

为什么如果我嵌套执行一个空数组在另一个for循环在一个非空数组上执行for循环,我得到一个浏览器阻止无限循环作为结果?在非空数组中循环一个空数组会产生一个无限循环:为什么?

var links = []; 

var anchors = ['a', 'b', 'c']; 

    // not empty loop 
    for(var i=0; i<anchors.length;i++) { 
     console.log(anchors[i]); 

     // empty loop 
     for(var i=0; i<links.length;i++) { 
      console.log(links[i]); 
     } 
    } 

for(var i=0; i<links.length;i++)里面的代码甚至没有评估,所以为什么这种行为?

回答

3

当第二个循环执行时,您将i变量(在第一个for循环中的第一个循环后等于1)重置为0。在第一个循环中,当第二个循环完成first周期(并且i具有1值)时,第一个循环再次被重置为0。等等......直到世界末日。

Hovewer - 像大利指出 - 如果你会使用let声明环内i变量,一切都会顺利开展。

var links = []; 
 

 
var anchors = ['a', 'b', 'c']; 
 

 
// not empty loop 
 
for (let i = 0; i < anchors.length; i++) { 
 
    console.log(anchors[i]); 
 

 
    // empty loop 
 
    for (let i = 0; i < links.length; i++) { 
 
    console.log(links[i]); 
 
    } 
 
}

+0

为什么呢?因为“让”让变量循环范围? – AmintaCode

+1

@AmintaCode因为'var'的作用域是最近的函数块(在你的情况下,它像一个全局变量,因为你没有把你的代码包装到一个函数体中)并且'let'的作用域被限定在最近的封闭块。 –

0

好了,所以如果嵌套阵列empy,其长度为0,所以:

for(var i=0; i<0;i++) { 
     console.log(links[i]); 
    } 

“i” 的永远不会为0和循环将是无限的...

+0

如果数组为空,则其长度为'0'。如果'i'为0并且长度为0,则'i <0'条件未满足 - 循环甚至不会启动。所以情况并非如此,imo。 –

+1

@ kind-user,你是对的....正确的答案是你的! – AmintaCode

0

因为链接数组的长度为0.当您执行此代码时

for(var i=0; i<links.length;i++) 

1)变量指定的值0

2)得到links.length - 它是0。 3),因为0 < 1,

console.log(links[i]); 

不会评价