2011-08-10 70 views
0

考慮這段JavaScript代碼:爲什麼JavaScript阻止?

<script type="text/javascript"> 

function loop(Message){ 
document.getElementById('output').innerHTML = 
document.getElementById('output').innerHTML + Message + '</br>'; 
} 

window.setInterval("loop('Message1')", 1000); //Prints "Message1" every 1 Seconds 
window.setInterval("loop('Message2')", 3000); //Prints "Message2" every 3 Seconds 

</script> 

<body> 
<div id="output"></div> 
</body> 

Output: 
Message1 
Message1 
Message2 
Message1 
Message1 
Message1 
Message2 
... 

現在考慮這個PHP-代碼:

<?php 
while(true){    // Print "Message1" every 1 Second 
echo 'Message 1 </br>'; 
sleep(1); 
} 



while(true){    //This Code will never be executed, 
echo 'Message 2 </br>'; //because the First Loop Blocks the Process!!!!! 
sleep(3); 
} 

?> 

Output: 
Message1 
Message1 
Message1 
Message1 
Message1 
Message1 
... 

爲什麼不第一JavaScript的循環停止,整個過程就像第while循環在PHP ?

我知道Javascript是SingleThreaded,所以我想,JavaScript不能只是開始一個新的Thread來處理Second Loop。所以我正在弄傷JavaScript如何不阻擋在這裏?

有人能解釋給我嗎?

回答

6

因爲setInterval特別是sleep

setInterval更像是一個調度程序。它標誌着應該執行某些事情的時間,並讓主線程完全忘記它,直到該時間到達。

sleep另一方面,基本上是一個無操作循環,它讓循環時不執行任何操作。

這很重要,因爲PHP和Javascript的用例完全不同。一個PHP腳本有一個開始和結束,它以線性方式執行。 Javascript用於交互性,這意味着它需要以非線性的方式響應各種事件(鼠標點擊,鍵盤輸入,定時器,AJAX回調),如同它們發生的那樣。如果主線程被阻塞等待定時器,則不會發生任何事情,界面會凍結。

這裏是通過jQuery的約翰Resig的關於JavaScript的定時器的好文章:http://ejohn.org/blog/how-javascript-timers-work/

0

因爲你沒有寫任何循環。

你剛纔註冊了一些應該以指定的間隔運行的代碼。

因此,每秒鐘一次loop使用自變量'Message1'執行,每3秒執行一次,並使用參數'Message3'執行。但是由於每次調用都很快返回,所以在第一次之後運行另一個不會有任何問題。

1

如JavaScript是單線程的,只有與執行命令棧。每次調用setInterval時,函數都會被放入堆棧,並且會在所有先前的執行時執行。當你有一堆數據要編譯時,這非常有用,但是希望ui不會被用戶輸入阻塞。 但是,當你使用JavaScripts,而它會有相同的阻止效果,如在PHP

+0

JavaScript是否像「事件循環」一樣工作? –

+0

不確定你是什麼意思的事件循環,但如果真的想了解發生了什麼事閱讀這篇博文:http://dmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts/ –

+0

是的,它的工作就像一個事件循環 –

0

Javascript,單線程,不能阻止。如果是這樣,整個瀏覽器活動(點擊,渲染等)將不再等待發生。

這就是爲什麼昂貴的操作(如ajax請求)使用回調機制來處理響應的原因。

現在,您的具體示例setInterval按照設計的方式工作(如setTimeout)。他們在不阻塞主線程的情況下處理sleep用例。

1

以前的答案是好的,但我有一些補充。也許它會對你有所幫助。在PHP

你的JavaScript代碼看起來就像這樣:

<?php 
function loop($message, $duration, $multiplier){ 
    while($multiplier--){ 
     echo $message; 
     sleep($duration); 
    } 
} 
while(true){ 
    loop("Message1", 1, 2); 
    loop("Message2", 1, 1); 
} 
?> 

但是你要記住(在同一時間在一個PHP腳本一個命令)什麼是在以前的帖子。

相關問題