2016-07-22 18 views
1

JavaScript ist nur eine Sprache und eine seiner Implementierungen ist die V8-Engine. Es wird sowohl in Chrome als auch in node.js verwendet.JavaScript: Browserunterstützung vs. reine Sprachunterstützung: setTimeout, setInterval

DOM Unterstützung ist nicht JavaScript-Sprachfunktion, es ist eine Browser-Funktion (es gibt keine DOM in reinem JS). Auf die gleiche Weise ist XMLHttpRequest kein Teil von JavaScript. Es ist ein Browser-Addon für die JS-Sprache.

Meine Frage bezieht sich aufPhilip Roberts' JS conf EU reden, wo er sagt, dass, unter anderem setTimeout ist nicht in V8. Und ich denke, er könnte sich irren, aber ich bin mir nicht sicher, und das ist meine Frage.

Wenn ich öffnen node.js (V8-based) Konsole und geben Sie die folgenden Schritte aus:

> Promise 
[Function: Promise] 
> setTimeout 
[Function] 
> setInterval 
[Function] 
> XMLHttpRequest 
ReferenceError: XMLHttpRequest is not defined 
    at repl:1:1 
    at REPLServer.defaultEval (repl.js:262:27) 
    at bound (domain.js:287:14) 
    at REPLServer.runBound [as eval] (domain.js:300:12) 
    at REPLServer.<anonymous> (repl.js:431:12) 
    at emitOne (events.js:82:20) 
    at REPLServer.emit (events.js:169:7) 
    at REPLServer.Interface._onLine (readline.js:211:10) 
    at REPLServer.Interface._line (readline.js:550:8) 
    at REPLServer.Interface._ttyWrite (readline.js:827:14) 

Ich sehe, dass:

  • Promise Prototyp gibt es, da es ein Teil von ES6 ist, bereits verfügbar unter neuen Versionen von Knoten. Es ist ein Teil der JS als Sprache
  • XMLHttpRequest gibt es nicht, da es in den Browsern nur verfügbar ist, ist es nicht Teil der Sprache
  • beide setTimeout und setInterval gibt es. Philip Roberts sagt, sie sind nicht - aber ich sehe sie unter node.js und Ich denke, dass sie sein sollten, da setTimeout/setInterval Sinn in single-threaded/async-Umgebung, egal, ob es ein Browser oder ein Server ist.

Ich glaube, er weiß, was er sagt, aber ich will verstehen, warum :)


edit:

Ich sehe setTimeout ist eine Funktion auf window Objekt. Und im Grunde ist window das Nicht-Standard-Zeug.

Antwort

4

Er hat recht, dass sie nicht Teil von V8 sind. Sie sind jedoch part of node.js (über ein Modul, die standardmäßig im Lieferumfang enthalten), und wird in einer Art und Weise gestaltet, dass sie mit der Browser-Spezifikation kompatibel sind:

Der Timer-Modul eine globale API für die Terminierung aussetzt Funktionen, die zu einem späteren Zeitpunkt aufgerufen werden sollen. Da die Timer-Funktionen global sind, müssen Sie nicht require ("Timer") aufrufen, um die API zu verwenden.

Die Timer-Funktionen in Node.js implementieren eine ähnliche API wie die Timer-API, die von Webbrowsern bereitgestellt wird, verwenden jedoch eine andere interne Implementierung, die um die Node.js-Ereignisschleife herum aufgebaut ist.