2015-12-07 16 views
6

私はリエントラントという言葉の理解を深めたいと思います。JavaScriptの再入可能

この関数はリエントラントですか?

function* foo() { 
    yield 1; 
    yield 2; 
} 

これは1つですか?

function foo() { 
    return 1; 
} 

これは1つですか?

var x = 0; 
function foo() { 
    return x++; 
} 

これは?

function foo() { 
    setTimeout(foo, 1000); 
} 
+0

http://stackoverflow.com/questions/2799023/what-exactly-is-a-reentrant-functionも参照してください。これはC++関連の質問ですが、答えは変わりません。 –

+1

誰かが不思議に思っているのは、重複した質問ではなく、JavaScriptとC++の実行モデルが異なるからです。 –

答えて

6

reentrent機能は、その実行を再開することができる機能である。コンピューティングにおける

それは安全にその実行の途中で中断することができるならば、コンピュータプログラム又はサブルーチンがリエントラントと呼ばれ以前の呼び出しが完了する前に再度呼び出されます( "再入力")。

ブラウザ/ノードJavaScriptでは、すべてのマルチプロセッシングは協調的(割り込みまたはコンテキストスイッチなし)です。 通常の関数は、JavaScriptで常に完了まで実行されます。(1)

あなたのケースでは、唯一のリレント機能は、コードを完了まで実行せず、後で再開できるため、最初の機能です。

  • 2番目の機能は単なる通常の機能です。
  • 3番目のスコープは外部スコープを使用します。これは、関数が何らかの状態を保持できるため類似しています。機能を再開することはできないので、同じことではありません。
  • 第4のものはただちに完了まで実行されます(別の呼び出しをスケジュールしますが、これはプラットフォームで、までです)。実際

- 1は発電がreentrent構文をJavaScriptで協調的マルチタスクを有効にすると言うことができます。ジェネレータの前にすべてのコードが完了しました。

(1)決して停止しませんが、中断されることはありません。共通プラットフォームでも。ルールを破るプラットフォーム(Rhinoなど)があります。それらは非常にまれであり、ブラウザ/ノードJSと同じ並行実行モデルを使用しません。

+0

なぜ2は再入可能ではありませんか? javascript実行モデルでは、一度に複数回呼び出すことはできませんが、まだリエントラントです。すべての通常の関数はリエントラントです。 – Sulthan

+0

実行中に中断することはできず、以前の呼び出しが実行を完了する前に再び安全に呼び出されるため、単純で単純です。より簡単に言えば、実行の途中で中断することはできません。これは、中断点(歩留まり)を宣言し、実行完了まで "ポンピング"できるジェネレータとは異なります。 –

+0

No.それはその定義に反するものです。一度に(2)を複数回呼び出すことはできますが、同じ結果が一貫して返されます。それがリエントラントなのです。 JSが並列実行をサポートしていないという事実は、それとは何の関係もありません。再入国の定義は、言語によって異なることはありません。 – Sulthan

関連する問題