2013-10-06 13 views
8

Ich habe eine EventListener, die auf das gesamte Dokument hört und Tastenanschläge aufzeichnet, aber ich möchte diesen Listener entfernen, wenn bestimmte Bedingungen erfüllt sind.Alternative zu arguments.callee

Im Folgenden ist ein Ausschnitt aus meinem Code:

document.addEventListener('keyup', function(e) { 
    var letter_entered = String.fromCharCode(e.keyCode).toLowerCase(); 
    player.makeGuess(letter_entered); 

    if(player.win_status === true || player.lose_status === true) { 
     document.removeEventListener('keyup', arguments.callee, false); 
    } 
}); 

Dies funktioniert jedoch nach dem Mozilla Developer Docs diese Methode ist veraltet.

Ich bin mir bewusst, dass ich die Funktion einfach benennen kann, aber gibt es eine Alternative, die mir erlauben würde, die unbenannte Funktion weiter zu verwenden?

+0

Nein. Sie müssen eine Referenz irgendwie speichern, wie 'arguments.callee' tut. –

+0

Warum würden Sie darauf bestehen, eine unbenannte Funktion zu verwenden? – user2736012

+0

@ user2736012 Frage ist mehr aus Neugier als aus praktischer Verwendung. – MitulP91

Antwort

2

Verwenden Sie eine andere anonyme Funktion als Wrapper eine benannte Funktion zu speichern (Rufenen Shim), um Ihre ursprüngliche Funktion:

document.addEventListener('keyup', (function(e) 
    { 
    var aFunction = function() 
    { 
    var letter_entered = String.fromCharCode(e.keyCode).toLowerCase(); 
    player.makeGuess(letter_entered); 
    }; 

    if(player.win_status === true || player.lose_status === true) 
    { 
    document.removeEventListener('keyup', window, false); 
    } 
    else 
    { 
    aFunction(); 
    } 
    } 
), false); 

Referenzen

8

Mit dem folgenden Prozess:

  • Erstellen einer Variablen
  • auf die Variable
  • eine anonyme Funktion zuweisen Invoke es mit dem variablen Referenz
  • Die anonyme Funktion Referenzen selbst die Variablennamen mit

sich als solche Verwendung:

var foo = function(e) 
    { 
    "use strict"; 
    console.log(e); 
    document.removeEventListener('keyup', foo, false); 
    } 

document.addEventListener('keyup', foo); 

Sie dieses Problem leicht den y combinator mit lösen kann:

function y(f) { 
    return function() { 
     return f.bind(null, y(f)).apply(this, arguments); 
    }; 
} 

Jetzt können Sie Schreiben Sie Ihren Code wie folgt neu:

document.addEventListener("keyup", y(function (callee, e) { 
    player.makeGuess(String.fromCharCode(e.keyCode).toLowerCase()); 
    if (player.win_status || player.lose_status) document 
     .removeEventListener("keyup", callee); 
})); 

Das ist alles Leute.

+0

Ist das anders als 'function y (f) {Rückgabe der Funktion yf() {return f.bind (null, yf) .apply (das, Argumente) '? –

+0

Ja, aber der ganze Punkt der OP-Frage besteht nicht darin, benannte Funktionen zu verwenden. –

+0

Coole Sachen, aber es beantwortet nicht die Frage, die im Titel steht. Fairerweise ist der Titel falsch. :) Aber ich suchte eigentlich nach der Antwort auf eine generische Alternative für 'arguments.callee' und das ist es nicht. –