2017-04-17 110 views
1

您好我很困惑與alertconsole.log的Javascript環路與警報

var count = []; 
 

 
function iterate(number) { 
 
    count.push(number); 
 
    for (i = 0; i < count.length; i++) { 
 
    console.log(count[i]); 
 
    } 
 
} 
 

 
iterate(2); 
 
iterate(3); 
 
iterate(4);

控制檯會給我2,2,3,2,3,4,但是當我改變控制檯。記錄(count [i])以提醒(count [i]);它會重複三次,爲什麼?

var count = []; 
 

 
function iterate(number) { 
 
    count.push(number); 
 
    for (i = 0; i < count.length; i++) { 
 
    alert(count[i]); 
 
    } 
 
} 
 

 
iterate(2); 
 
iterate(3); 
 
iterate(4);

做到這一點上面,但它確實on JSBin

+0

附註:上述內容不會造成問題,但代碼正在淪爲[隱式全局的恐怖](http://blog.niftysnippets.org/2008/03/horror-of-implicit- globals.html)*(這是我貧血的小博客上的一篇文章)*。在'iterate'中聲明'i'。 –

+0

我很困惑,怎麼樣?我認爲警報輸入計數數組的元素,每當我調用該函數,數組的長度將增加 –

+0

我的意思是當我在JS Bin(警報類型)中嘗試它時,它會在第一個,第二個和第三個電話 –

回答

1

兩個版本都顯示相同的內容。

count開始爲空。

第一次調用,你推到2所以count[2],然後循環只有一次(i == 0),輸出count[0](這是2)。

在第二個呼叫,則推入3count所以它有在它[2, 3],和循環兩次(i == 0i == 1),顯示count[0](2)和count[1](3)。

在第三呼叫,則推4count所以它有在它[2, 3, 4],和循環三次(i == 0i == 1i == 2),顯示count[0](2),count[1](3),和count[2](4)。


回覆您的評論:

我的意思是,當我嘗試在JS斌(警報類型),它只會在第一,第二和第三個呼叫警報2

啊!你遇到了JSBin的「無限循環保護」。如果你運行它here,並期待在Web控制檯,你會看到

在第5行退出潛力無限循環要禁用環路保護:加「// noprotect」你的代碼

...但是如果您運行the output page of that,則會顯示完整結果。

alert版本觸發了開發模式的無限循環的保護,因爲它看到相同的代碼發生不止一次,但100ms以上的間隔(因爲當您關閉alert延遲)更多。