Frage In Bezug auf JavaScript Funktion Unorthodoxie


Ich programmiere schon seit einiger Zeit für das Web, habe aber erst vor kurzem ein paar neue Feinheiten in Bezug auf die Verwendung von Funktionen und die seltsamen (oder so sehe ich sie als) Dinge entdeckt, die man damit machen kann. An dieser Stelle scheinen sie jedoch nur syntaktisch schöne Dinge zu sein. Ich hatte gehofft, dass mich jemand aufklären könnte, wie sich einige dieser neu entdeckten Aspekte als nützlich erweisen könnten.

Zum Beispiel, als ich das erste Mal lief, dachte ich mir, dass es nicht funktionieren würde:

<script>
function x(q)
 {
q(x);
 }

x(function(a)
 {
alert(a);
 }
 );
</script>

Aber es hat! Irgendwie, das Erstellen einer benannten Funktion, die eine andere, anonyme Funktion als einzigen Parameter erhält und dann die Funktion ausführt, die an sie übergeben wird, als Parameter an sie übergeben, funktioniert gut. Das hat mich positiv geblendet und ich bin mir fast sicher, dass es eine große Portion Praktisches dazu gibt, aber ich kann es noch nicht richtig platzieren.

Ah, und eine andere Sache, die ich entdeckt habe: Mit einer globalen Variablen zum Speichern einer Funktion kann man später in der Ausführung die eval () - Funktion von JavaScript verwenden, um diese Variable zu ändern und so die inneren Funktionen der Funktion dynamisch zu ändern. Ein Beispiel:

<script>
var f = function()
 {
alert('old text');
 }

eval('f = ' + f.toString().replace('old text', 'new text'));

f();
</script>

Sicher genug, dieser Code warnt die Zeichenfolge "new text"; als ich das sah, war mein Geist wieder einmal durchgebrannt, aber auch sofort fasziniert von dem Potenzial, etwas Unglaubliches zu erschaffen.

Also ... meine brennende Frage für Stack Overflow: Wie können solche scheinbar abstrakten Kodierungsprinzipien positiv genutzt werden?


5
2018-01-26 20:22


Ursprung


Antworten:


Einfach googeln Javascript als funktionale Sprache und Sie werden Hunderte von Anwendungen und Beispielen finden.


5
2018-01-26 20:29



Was du im Grunde fragst ist Wie kann ich Funktionen als erstklassige Objekte verwenden?

Die größte und am häufigsten verwendete Verwendung sind Closures (oder anonyme Funktionen) für die Ereignisbehandlung. Aber nur weil Sie clever sein können, heißt das nicht, dass Sie es sollten. Schreibe klaren, lesbaren Code wie in jeder anderen Sprache.

Oh, und prügeln Sie sich für das Eintippen von eval und noch nie Denk darüber nach, es wieder zu tun


5
2018-01-26 20:30



Der erste, closures, ist in Javascript sehr verbreitet. Wenn Sie etwas mehr fortgeschrittene Beispiele haben möchten, hier ist ein schöner interaktiver Spielplatz, mit dem Sie sich beschäftigen können: http://ejohn.org/apps/learn/.

Hier ist meins window.onload Funktion, die ich benutze, wenn alles, an dem ich arbeite, keine vollständige Bibliothek erfordert.

//add events to occur on page load
window.addOnload = function(fn) {
    if (window.onload) {
        var old = window.onload;
        window.onload = function() {
            old();
            fn();
        }
    } else {
        window.onload = fn;
    }
}

Dann, wann immer ich etwas onload brauche, kann ich einfach eine anonyme Funktion verwenden. Hier ist ein Beispiel aus einem kürzlichen Wartungsprojekt von mir.

//make all menu items have a hover property
window.addOnload(function(){
    var cells = document.getElementsByTagName('td');

    for (var i=0; i < cells.length; i++) {
        if (cells[i].className != 'NavMenuItem')        continue;

        (function(cell){
            cell.onmouseover = function() {
                cell.className = 'NavMenuItemHighlight';
            }
            cell.onmouseout = function() {
                cell.className = 'NavMenuItem';
            }
        })(cells[i])
    }
});

Was deine zweite "Entdeckung" betrifft, tu so, als hättest du nie davon erfahren.


3
2018-01-26 20:31



Nun, der erste ist in der Regel, wie Sie beweisen, dass das Halteproblem unentscheidbar ist ...

Ob du das als "nützlich" ansiehst oder nicht, liegt ganz bei dir, ich schätze B-)


0
2018-01-26 20:35