JS: Frage zur Funktions-Syntax



  • Hallo,

    ich habe noch eine Syntax in Javascript entdeckt, welche mir nicht geläufig ist, und zu der ich unfähig bin gezielt danach im Web zu suchen, weil ich nicht weiß wonach ich suchen muß.

    Hier ein original Codeblock (anonymisiert):

    function ULSM53(){var o=new Object; o.ULSTeamName="Monitoring Service";o.ULSFileName="MonitoringService.js";return o;}
    
    Type.registerNamespace('MONITOR');
    
    MONITOR.RequestRecord = function MONITOR_RequestRecord(height, width)
    {ULSM53:;
        this.Height = height;
        this.Width = width;
    }
    

    Diese Syntax überfordert mich echt 😕

    Frage 1: Was ist das für eine Syntax mit der Funktion ULSM53()? Sie wird aufgerufen mit "ULSM53:;", das sieht sehr seltsam aus, was passiert denn hier?

    Hier nicht zu sehen ist, daß noch etliche weitere Funktionen im original Code vorkommen, die alle zu Beginn "ULSM53:;" aufrufen.

    Frage 2: "RegisterNamespace" sagt mir was, aber das "Type" kenne ich nicht, woher kommt das?

    Frage 3: die Funktionsdefinition "MONITOR.RequestRecord = function MONITOR_RequestRecord" verstehe ich wieder nicht. Ich dachte "RequestRecord" ist bereits der Name der Funktion, aber dann kommt danach "function MONITOR_RequestRecord()", also nochmal ein Funktionsname. Wie ist das zu erklären?

    Nochmals Danke für alle Hilfen! Suche passende Literatur (online oder gedruckt) dazu, die das alles erklärt. Vielen Dank.


  • Mod

    Hoppelmoppel schrieb:

    Frage 1: Was ist das für eine Syntax mit der Funktion ULSM53()? Sie wird aufgerufen mit "ULSM53:;", das sieht sehr seltsam aus, was passiert denn hier?

    Das ist ein Label, genauso wie in C:
    foo:
    goto foo;

    Frage 2: "RegisterNamespace" sagt mir was, aber das "Type" kenne ich nicht, woher kommt das?

    Von irgendwoher. Es ist einfach ein Objekt das existiert. Wer und wo es wie definiert hat, kann man so nicht sagen.

    zB ein:
    window.Type={};
    würde hier schon reichen.

    Frage 3: die Funktionsdefinition "MONITOR.RequestRecord = function MONITOR_RequestRecord" verstehe ich wieder nicht. Ich dachte "RequestRecord" ist bereits der Name der Funktion, aber dann kommt danach "function MONITOR_RequestRecord()", also nochmal ein Funktionsname. Wie ist das zu erklären?

    Es ist unnötig der anonymen Funktion noch einen extra Namen zu geben. Manchmal wird es gemacht um innerhalb der Funktion die Funktion selber ansprechen zu können.

    Aber der Code ist sehr ungewöhnlich.



  • Nachgefragt (steige auch gerade wieder in die JavaScript-Programmierung ein...)

    1. D.h. aber, dass ULSM53:; nicht die Funktion oben aufruft? Bzw. der Funktionsaufruf oben nicht zum Label springt?

    2. Müsste da nicht "var" davorstehen? Bzw. wäre es guter Stil vor MONITOR.RequestRecord ein "var" zu haben?

    MfG SideWinder


  • Mod

    SideWinder schrieb:

    Nachgefragt (steige auch gerade wieder in die JavaScript-Programmierung ein...)

    Yay 🙂
    JS ist eine coole Sprache.

    1. D.h. aber, dass ULSM53:; nicht die Funktion oben aufruft? Bzw. der Funktionsaufruf oben nicht zum Label springt?

    Exakt. Es ist einfach ein Label dass zufällig so heisst wie eine Funktion. Ob das in gewissen Situationen zu Problemen führen kann, weiß ich nicht. Niemand verwendet Labels.

    Da sie aber in unterschiedlichen Scopes liegen, sollte es keine Probleme geben.

    1. Müsste da nicht "var" davorstehen? Bzw. wäre es guter Stil vor MONITOR.RequestRecord ein "var" zu haben?

    var hat nichts mit Stil zu tun, sondern mit Scope. In JS ist alles immer eine Frage des Scopes.

    In diesem Fall hier, ist var nicht erlaubt. var führt einen neuen Namen in den aktuellen Scope ein.
    MONITOR.RequestRecord = function() {}

    MONITOR ist ja bereits bekannt (sonst könnte ich ja nicht MONITOR.irgendwas sagen) und RequestRecord liegt jetzt im Scope von MONITOR. Für das ist kein var notwendig, da wir mit MONITOR. ja schon gesagt haben welcher Scope verwendet wird. Und var wäre hier dadurch illegal - da wir keinen neuen Namen in den aktuellen Scope einführen (RequestRecord liegt ja nicht im aktuellen Scope sondern in MONITOR).

    PS:
    Ein kleines Beispiel für var:

    (function() {
    function foo() { ++bar; }
    function foo2() { var bar; bar=4; }
    
    var bar=1;
    console.log(bar);
    foo();
    console.log(bar);
    foo2();
    console.log(bar);
    })();
    

    Ausgabe:
    1
    2
    2




Anmelden zum Antworten