2015-01-03 13 views
11

Ich war Surfen durch den Quellcode hier: http://js-dos.com/games/doom2.exe.html und ein paar Dinge aufgefallen:Was ist der Zweck dieser Evaluierungsbedingung?

if (typeof Module === 'undefined') 
{ 
    Module = eval('(function() {try { return Module || {} } catch(e) { return {} }})()'); 
} 
  • Die Funktion des Moduls mit einem Inline-Skript-Tag definiert ist
  • Es später wieder in einem anderen inline mit var deklarierte Dieses Mal prüft es, ob das Modul existiert.

Meine Frage: Was ist der Punkt Modul deklariert mit einer Funktion zur Selbst rufenden wenn es nur werde versuchen, das Modul wieder annehmen? Ist es nicht schon bewiesen, dass es nicht existiert? Warum deklarieren Sie Modul nicht einfach als {}?

+4

Dieser Code ist im emscripten-Projekt auf github. Es wurde in diesem Commit hinzugefügt: https://github.com/kripken/emscripten/commit/22d510338239c1cf33136392c77a9b3d7d2ce2bc Sie haben sich von der expliziten Deklaration in die Eval-Anweisung bewegt, aber das Commit msg isn; t klar warum! Ich habe emscripten als Tag hinzugefügt, dann könnte jemand aus dem Projekt, oder wer es gut kennt, es erkennen und in der Lage sein zu helfen. – sifriday

Antwort

5

typeof Module ist möglicherweise nicht definiert, wenn Module eine lokale Variable ist, die undefined enthält. Dieser Code soll einige Fälle unterstützen, Modul kann lokal oder global sein und definiert oder nicht definiert sein. Wir wollen vermeiden, den globalen Geltungsbereich zu verschmutzen, also tun wir nicht einfach Module = ..., wenn es undefiniert ist.

Zunächst ist der übliche Fall emscripten-generierten Code im globalen Bereich. In diesem Fall kann das Modul definiert sein oder nicht und es kann lokal sein, aber immer noch undefined, also müssen wir beide behandeln.

Zweitens kann emscripten Code nur ein Modul sein, wie ein Spiel, das ammo.js verwendet. In diesem Fall ist die Verwendung

function Ammo(Module) { 
    // emscripten-generated code, uses the Module 
    return something; 
} 

so Modul ist in diesem Fall eine Funktion lokal, als param gegeben bereits für uns definiert.

Wir können nicht einfach var Module deklarieren, weil das Modul eine lokale Variable ist. Also müssen wir eval. Für eval benötigen wir eine Funktion, die einen Wert zurückgibt, weil wir einen try-catch brauchen. Der try-catch verwendet Modul und wird ausgelöst, wenn das Modul kein lokaler ist (unabhängig davon, ob es undefined enthält oder nicht), was genau das ist, was wir wollen.

Es ist möglich, dass dieser Code vereinfacht werden könnte!

+2

Da Sie es nicht erwähnen, für die Aufzeichnung: ** Alon ist der Autor dieser Zeilen. ** –

+2

Die Kombination von Github und SO ist mächtig beeindruckend, & nützlich, um in der Lage zu sein, eine Frage wie folgt zu nehmen und beizutreten es bis zum Commit und dann der Autor, der dann die Frage beantworten kann. – sifriday