2016-09-02 10 views

答えて

1

簡単な答えは、それは真実ではないです。 setTimeoutまたはXmlHttpRequest.onreadystatechangeなどに渡された関数について考えてください。これらの関数は、の将来のの特定の時刻または未定義の時刻に実行されます。 setTimeoutが起動したとき、またはready状態変更イベントが発生したときに関数がすでに実行されている場合、setTimeoutまたはready状態ハンドラの統計が実行される前に、その関数が終了するまで待機しません。

代わりに、2つ(以上)の関数をインタプリタによって同時に実行することができます。 と同時にが実行されているように見えるかもしれませんが、技術的にはそうではありません。

最初の関数の実行は一時停止しており(命令が終了してから次の命令が開始されるまで)、他の関数の命令はしばらく実行されます。その後、この関数の実行は一時停止され、前に一時停止した関数の実行が再開されます。

1

JavaScriptは1つのスレッドのみを使用します。したがって、同時に、2 の指示が並行して実行されることは全く不可能です。しかし、コードのある部分から別の部分に「ジャンプ」するイベントのキューがあります。

しかし

機能は、1つの以上の命令を使用していますので、彼らが同期実行されて発生する可能性があります。

+0

"they" - U meen instructions? –

+0

私は関数 – Mayday

0

javascriptは、イベントベースのシングルスレッド「pseudoasync」スクリプト言語になるように設計されています。

しかし、WebWorkerと呼ばれるもので、指定されたスクリプトファイルでシステムに新しいプロセスを作成するので、アプリケーションに2番目のスレッドが必要です。 intrestedて(?) - What are the use-cases for Web Workers?

0

Yesにリダイレクトし、機能がアトミック操作

より正確であることであり、各機能は、各メッセージが作業者に進み、実行されるであろうqueueの一部であるメッセージであります最後まで。非ブロック操作の場合は

visualization should be here

ランタイムのために必要な時間は、関数の作成とsetTimeoutのようなもののためにはるかに大きいので、倍の小さなブロッキング操作のほとんどは、最初に実行されます。

console.log('foo'); 
 

 
setTimeout(function() { 
 
    console.log('bar'); // This will be called last 
 
}); 
 

 
console.log('baz');

+0

を意味していますが、 'console.log( 'baz');を' while(true); 'bar word 'に置き換えた場合は、そのすべてが –

+0

には表示されません。単一のスレッドを永続的にビジー状態に保つと、それは決して次の命令には行きません。それはなぜあなたが決して睡眠や重い操作を使用することはありません非同期操作のJavaScriptで。あなたはGUIをブロックする – Mayday

+0

@ Vladuysha良い点。私は、while(true);もアトミックな操作であり、実行が完了するまでランタイムが待機するためだと思います(https://developer.mozilla.org/en-US/docs/Web/ JavaScript/EventLoop#Run-to-completion)原則。 –

関連する問題