Ist es möglich, eine anonyme Funktion als "Live Code" zu kennzeichnen, damit Closure Compiler sie nicht entfernt?

  • Wie kann ich Closure-Compiler mitteilen, dass eine anonyme Funktion nicht als toter Code entfernt werden soll? Ich möchte die Funktion nicht im Fensterobjekt speichern. Ich suche nach einer alternativen Technik.

    Angenommen, ich habe eine Javascript-Datei, die eine riesige anonyme Funktion enthält.

     (function(){return "I am here!"})
     

    Zur Verwendung lade ich diese Funktion über ajax herunter und fange dann die Ausgabe von eval mit etwas wie

     var f = eval('(function(){return "I am here!"})');
     

    Damit wird die anonyme Funktion in der Variablen f zugewiesen.

     d8> var f = eval('(function(){return "I am here!"})');
    d8> f
    function (){return "I am here!"}
    d8> f()
    I am here!
     

    Wenn ich den Compiler über meine js-Datei mit einer einzigen großen anonymen Funktion ausführen, wird der Compiler "optimiert "mein Code durch Ausgabe von nichts. Dies ist offensichtlich nicht das, was ich will. Gibt es eine Art JSDoc, das ich über meine Funktion setzen kann, um zu kennzeichnen, dass es sich nicht um einen toten Code handelt?

    ~~~~~~~~~~~~~~~~ ~~~~~~~~

    Umgehung: (Dies ist nicht wirklich das, was ich wollte, aber es scheint das beste Ergebnis mit den verfügbaren Tools zu sein)

    ~~~~~~~~~~~~~~~~~~~~~~~

    Ich bin am Ende gelandet Verwenden einer Kombination aus Johns und Davids Antworten:

     // code would be provided from an ajax request
    var code = 'function F(){return "I am here!"};'
    
    code = "("+code.replace(/\s*\;\s*$/, "")+");"
    
    f = eval(code);
     

    Wenn der Funktion ein Name gegeben wird, ist der Closure Compiler glücklich.

    Abhängig von der Funktion definiert der Schließungs-Compiler Variablen außerhalb der Funktion, sodass ich den Code in Klammern einhülle, um die Definition globaler Variablen zu vermeiden.

    Die Ersetzungsmethode verschiebt lediglich das letzte Semikolon, das zur Trennung der Funktionsdefinition verwendet wird, sodass kein Syntaxfehler auftritt.

    22 November 2011
    user319862
2 answers
  • Der Compiler ist nicht für die Verwendung von Code-Snippets ausgelegt. Die einzige Lösung, die ich sehe, ist, den Code gültig zu machen.

     var a = (function() {...})();
     

    und Nachbearbeitung des Codes zum Entfernen des Codes Teile, die du nicht willst. Im ADVANCED-Modus ist dies möglicherweise nicht möglich, da möglicherweise versucht wird, die Funktion zu integrieren.

    23 November 2011
    John
  • Sie können die Funktion in der Datei ohne den Wrapper speichern, was den Compiler daran hindert, sie zu "optimieren", und dann den Wrapper der Funktion hinzufügen, wenn Sie ihn auswerten.

     var code = 'return "I am here!";';
    var f = eval('(function(){' + code + '})');
     

    Wenn Ihr Code ohne den Wrapper der Funktion wirklich "ungültig" ist, können Sie ihn in einem Wrapper belassen, aber den Wrapper ausführen und dann wie oben beschrieben vorgehen. Zum Beispiel:

     var code = '(function(){return "I am here!";}())';
    var f = eval('(function(){return ' + code + '})');
     
    22 November 2011
    david