2009-08-19 4 views
4

Ich stieß auf dieses Thema, als ich durch die Dokumentation von PrototypeJS las: seine Identity Function. Ich habe ein wenig weiter geforscht & gelesen und ich denke, ich verstehe seine mathematische Basis (zB Multiplikation mit 1 ist eine Identitätsfunktion (oder habe ich das falsch interpretiert?)), Aber nicht warum Sie würden ein JS schreiben (oder PHP oder C oder was auch immer) -Funktion, die im Grunde genommen X als Parameter verwendet und dann einfach so etwas wie tut.Zweck einer Identitätsfunktion?

Gibt es einen tieferen Einblick, der damit verbunden ist? Warum liefert Prototyp diese Funktion? Wofür kann ich es verwenden?

Thanks :)

Antwort

7

die Identitätsfunktion verwenden macht die Bibliothek Code lesen etwas einfacher. Nehmen Sie die Enumerable#any Methode:

any: function(iterator, context) { 
    iterator = iterator || Prototype.K; 
    var result = false; 
    this.each(function(value, index) { 
     if (result = !!iterator.call(context, value, index)) 
     throw $break; 
    }); 
    return result; 
    }, 

Es ermöglicht Ihnen, zu überprüfen, ob alle Elemente eines Arrays wahr sind in einem Booleschen Kontext. Wie so:

$A([true, false, true]).any() == true 

aber es ermöglicht Ihnen auch jedes der Elemente zu verarbeiten, bevor für echte Prüfung:

$A([1,2,3,4]).any(function(e) { return e > 2; }) == true 

nun ohne die Identitätsfunktion haben Sie würden zwei Versionen einer Funktion zu schreiben, ein wenn Sie vorverarbeiten und wenn Sie nicht vor.

any_no_process: function(iterator, context) { 
    var result = false; 
    this.each(function(value, index) { 
     if (value) 
     throw $break; 
    }); 
    return result; 
    }, 

    any_process: function(iterator, context) { 
    return this.map(iterator).any(); 
    }, 
0

Ich weiß nicht, über diese Bibliothek, aber in der Regel, Sie optimieren formuals oder Code oder was auch immer von gemeinsamem Teil aus Factoring, wie if (add) (a + b) + x else a + b in a + b + (add ? x : 0) neu geschrieben werden soll. Sie sind versucht, das gleiche mit

Sieht ähnlich aus. Sie können leicht einen gemeinsamen Faktor oder einen gemeinsamen Ausdruck herausfiltern, aber wie können wir eine Funktionsanwendung ausklammern? Wenn Sie mathematiscs oder Hascel verstehen, sollten Sie sehen, dass

a ? x + v : v 

sehr ähnlich wie

a ? f value : value 

Sie x in einem Fall hinzufügen, sieht aber nicht in der anderen. Sie wenden die Funktion in einem Fall an, aber nicht in dem anderen. Sie optimieren die ehemalige in , weil 0 ist additive identity (es ändert nichts, wenn es hinzugefügt wird) und v ist ein gemeinsamer Faktor hier, der immer kommt, unabhängig von application of x. Im Falle einer Funktionsanwendung (oder einer Anwendung) ist der Rückruf der gemeinsame Faktor. Wir wollen es ausklammern. Was ist die Identitätsfunktion, die wir anwenden sollten, damit sich nichts ändert? Identitätsfunktion!

(a ? f : identity) value 

ist das, was wir suchen. Unser ursprüngliches Beispiel sieht wie folgt dann

(initialized ? identity : initialize) (callback_with_very_long_name) 

Bitte beachten Sie, dass es jetzt in einer Zeile der Seite passt.