2012-04-04 7 views
8

Ich arbeite im strikten Modus zum ersten Mal und, was-d'ya-wissen, es ist auch das erste Mal seit Jahren in der Lage, eine nicht strikte Modus-Eigenschaft zu verwenden wäre nützlich . Mein question here umreißt das genaue Problem, das ich habe, aber die Lösung, die ich ausgearbeitet habe, könnte an etwas viel besser skalierbar angepasst werden, wenn ich noch Zugang zu arguments.callee hätte.Argumentieren.callee im strikten Modus replizieren

Ohne die Funktion zu benennen gibt es im strikten Modus eine Möglichkeit, dass ich einen Verweis auf die Funktion bekommen kann, in deren Bereich ich mich gerade befinde?

+0

Sie können Ihre Funktion zuweisen zu einer Variablen. – antyrat

+0

Fortschritt ist eine schöne Sache. – Rolf

Antwort

5

, ohne die Funktion zu benennen ist Gibt es irgendeinen Weg im strikten Modus, dass ich einen Verweis auf die Funktion bekommen kann, in deren Bereich ich mich gerade befinde?

Nein. Sie müssen der Funktion einen Namen geben. Mein Fehler, ich dachte an einen Weg, siehe den letzten Codeblock unten. Ich nicht wie es, aber da sind wir. :-)

Beachten Sie, dass die Art und Weisen Sie die Funktion hier einen Namen geben:

UsageGraph = Graph.extend({ 
    generateScale: function GS() { 
     var parentMethod = this.constructor._super.generateScale; 
     if(parentMethod === GS) { 
      parentMethod = this.constructor._super.constructor._super.generateScale; 
     } 
     parentMethod.call(this); // run the parent's method 
     //do additional stuff 
    } 
}) 

... verwendet einen benannte Funktion Ausdruck. Diese sind notorisch unzuverlässig (link, link) über Implementierungen (sie sollten nicht sein, aber sind), vor allem in Ihrem Beispiel oben, IE8 und früher wird zwei völlig separate Funktionsobjekte erstellen, die Zuordnung einer von ihnen generateScale Eigenschaft und bezogen auf eine verschiedene Funktionsobjekt innerhalb der Funktion als GS.

Es ist einfach zu beheben, aber:

UsageGraph = Graph.extend(function(){ 
    function GS() { 
     var parentMethod = this.constructor._super.generateScale; 
     if(parentMethod === GS) { 
      parentMethod = this.constructor._super.constructor._super.generateScale; 
     } 
     parentMethod.call(this); // run the parent's method 
     //do additional stuff 
    } 

    return {generateScale: GS}; 
}()) 

Oder wenn Sie wirklich die Funktion einen Namen haben nicht wollen (ich es vorziehen, dass sie Namen haben, helps my tools help me, aber hey), können Sie ein verwenden Lokal innerhalb dieser Schließung:

UsageGraph = Graph.extend(function(){ 
    var GS = function() { 
     var parentMethod = this.constructor._super.generateScale; 
     if(parentMethod === GS) { 
      parentMethod = this.constructor._super.constructor._super.generateScale; 
     } 
     parentMethod.call(this); // run the parent's method 
     //do additional stuff 
    }; 

    return {generateScale: GS}; 
}()) 

Jetzt haben Sie eine anonyme Funktion, sondern es als GS aus nachschlagen zu können. Nochmals, ich würde es nicht empfehlen, denn dann kann man den Funktionsnamen in Anruflisten und dergleichen nicht sehen, aber man hat gesagt, ohne der Funktion einen Namen zu geben, also ...

+1

+1 für die Köpfe über den wheresrhys

+0

@wheresrhys: (Es ist

0

Ja, aber nein ... Ich bin mir nicht sicher, ob dies die gleiche Art und Weise von "Naming" ist, die Sie sprechen:

var foo = function bob() { 
    // call bob(); 
} 

// bob is undeclared; here it's foo! 

http://jsfiddle.net/4y8pY/

+3

Seien Sie vorsichtig mit IE8 und früher, es erstellt [zwei völlig separate Funktionsobjekte] (http://blog.niftysnippets.org/2010/09/double-take.html) und leckt das 'bob' Symbol, wenn Sie verwenden ein benannter Funktionsausdruck –

+0

Beachten Sie auch, dass der Fragesteller * "** Ohne ** die Funktion" * (meine Betonung) nennt. –

Verwandte Themen