2015-12-07 9 views
6

Ich möchte mein Verständnis des Wortes Reentrant verbessern.Reentrancy in JavaScript

Ist diese Funktion reentrant?

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

Und dieses?

function foo() { 
    return 1; 
} 

Und dieses?

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

Und dieses?

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

Siehe http://stackoverflow.com/questions/2799023/what-exactly-is-a-reentrant-function auch, es ist eine C++ verwandte Frage, aber die Antwort bleibt die gleiche. –

+1

Für den Fall, dass sich jemand fragt - Es ist keine doppelte Frage, da es sich nicht um JavaScript handelt und C++ ein anderes Ausführungsmodell hat. –

Antwort

6

A reentrent Funktion ist eine Funktion, deren Ausführung wieder aufgenommen werden kann:

In Computing, ein Computerprogramm oder Unterprogramme einspringenden aufgerufen wird, wenn es in der Mitte seiner Ausführung unterbrochen werden kann und dann sicher erneut aufgerufen ("neu eingegeben"), bevor die vorherigen Aufrufe abgeschlossen sind.

Im Browser/Knoten JavaScript ist die gesamte Multiprocessing kooperativ (keine Interrupts oder Kontextwechsel). Eine reguläre Funktion wird immer in JavaScript ausgeführt. (1)

Also in Ihrem Fall - die einzige Reentrent-Funktion ist die erste, da es seinen Code nicht zum Abschluss führt und zu einem späteren Zeitpunkt wieder aufgenommen werden kann.

  • Die zweite Funktion ist nur eine normale Funktion.
  • Die dritte verwendet einen äußeren Bereich, der irgendwie ähnlich ist, weil es eine Funktion einen Zustand halten lässt. Es ist jedoch nicht das Gleiche, da die Funktion nicht fortgesetzt werden kann.
  • Die vierte läuft gerade zur Vollendung sofort (es plant eine weitere Invokation davon - aber das ist bis die Plattform und nicht JavaScript).

der Tat - kann man sagen, dass Generatoren kooperatives Multitasking in JavaScript mit einer reentrent Syntax aktivieren. Vor den Generatoren lief der Code vollständig ab.

(1) Oder es wird nie angehalten, aber es wird nie unterbrochen. Auch - in gemeinsamen Plattformen. Es gibt Plattformen (wie Rhino), die die Regel brechen. Sie sind sehr selten und verwenden nicht das gleiche Parallelitätsausführungsmodell wie Browser/Node JS.

+0

Warum 2 nicht reentrant ist? Während das JavaScript-Ausführungsmodell es nicht erlaubt, es mehrmals hintereinander aufzurufen, ist es immer noch reentrant. Alle regulären Funktionen sind reentrant. – Sulthan

+0

Weil es nicht mitten in seiner Ausführung unterbrochen werden kann und dann sicher wieder aufgerufen werden kann, bevor sein vorheriger Aufruf die Ausführung beendet hat - schlicht und einfach. Einfacher gesagt - es kann einfach nicht in der Mitte seiner Ausführung unterbrochen werden. Dies ist anders als bei Generatoren, die Unterbrechungspunkte (Ausbeuten) deklarieren können und zum Ausführungsabschluss "gepumpt" werden können. –

+0

Nein. Einfach nicht.Das widerspricht der Definition. Sie können (2) mehrere Male gleichzeitig aufrufen und es wird immer noch das gleiche Ergebnis zurückgeben. Das macht es wiedereintrittsfähig. Die Tatsache, dass JS keine parallele Ausführung unterstützt, hat damit nichts zu tun. Die Definition von Reentrancy ist für verschiedene Sprachen nicht unterschiedlich. – Sulthan