2015-01-11 9 views
7

Funktionen in Javascript sind ebenfalls ein Objekt und können Eigenschaften haben. Gibt es eine Möglichkeit, auf seine Eigenschaften innerhalb eines eigenen Funktionskörpers zuzugreifen?Zugriff auf Eigenschaften von Funktionsobjekten innerhalb des Funktionskörpers

wie diese

var f = function() { 
    console.log(/*some way to access f.a*/); 
}; 
f.a = 'Test'; 
f(); //should log 'Test' to console 
+2

Uh, einfach 'f.a' benutzen? – Bergi

+0

Nun, Ihr Beispiel verwendet eine Referenz, so erhalten Sie die Antworten entsprechend. – tishma

Antwort

1

arguments.callee ist die Funktion selbst und nicht durch den Namen der Funktion beeinträchtigt wird erhalten.

var f = function() { 
    console.log(arguments.callee.a); 
}; 
f.a = 'Test'; 
f(); 
+1

Große Antwort! Ich glaube, das ist der sauberste Ansatz. In torazaburo Antwort, Bindung der Funktion an sich selbst verliert die Referenz der Eltern bei der Verwendung von "this", und Christos Antwort funktioniert nicht, wenn die Funktion keinen Bezeichner hat (dh anonyme Funktion) – Daniel

+0

Allerdings bei der Verwendung dieser Ansatz in rekursive Wie dem auch sei, der Wert von 'this' wird für jeden Aufruf unterschiedlich sein, der erste ist der Eltern-Parameter der Funktion, der nächste wäre die arguments-Eigenschaft des vorherigen Aufrufs, da wir die Funktion vom arguments-Objekt aus aufrufen würden .callee, Wir müssten arguments.callee.apply (this) benutzen! – Daniel

+0

Aber für den eigentlichen Zweck dieser Frage ist in der Tat die beste Antwort! – Daniel

2

Sie könnten nur verwenden:

console.log(f.a); 

Wenn f ausgeführt wird, f(), bevor f.a = 'Test'; Sie undefined in der Konsole bekommen, da es keine Eigenschaft ist mit Name/Schlüssel a definiert werden. Nach der Ausführung von f.a = 'Test'; wird der Name/Schlüssel a auf f definiert und der entsprechende Wert wäre 'Test'. Bei Ausführung der Funktion f würde daher der Wert 'Test' die Ausgabe an die Konsole sein.

0

Prototypes ist was Sie suchen.

var F = function() { 
    console.log(this.a); 
} 

F.prototype.a = 'Test'; 

// instantiate new Object of class F 
new F(); 

Hoffe, das hilft!

+0

danke, aber was ich möchte fragen, ist der Zugriff auf Eigenschaften der Funktion selbst anstelle von Eigenschaften des Prototyps – KwiZ

2

Der klassische Weg, dies zu tun ist, um die Funktion selbst zu binden, wonach er seine eigenen Eigenschaften über this zugreifen:

var f = function() { 
 
    console.log(this.a); // USE "THIS" TO ACCESS PROPERTY 
 
}; 
 

 
f.a = 'Test'; 
 
f = f.bind(f);   // BIND TO SELF 
 

 
f();      // WILL LOG 'Test' TO CONSOLE

-1

Sie können dies einrichten mit einem IIFE :

var f = (function() { 
    function f() { 
    console.log(f.a); 
    } 
    f.a = 'Test'; 
    return f; 
})(); 

f() // logs 'Test' 
f.a === 'Test' // true 

Beachten Sie, dass Sie müssen (eine Funktionsdeklaration oder gerade) nicht verwenden f für diese richtig funktioniert:

var f = (function() { 
    var _f = function() { 
    console.log(_f.a); 
    }; 
    _f.a = 'Test' 
    return _f; 
}); 

f() // logs 'Test' 
f.a === 'Test' // true 

Einige Leute mögen überall die gleiche Variable verwenden, zu betonen, dass die inneren f schließlich werden äußerte die f, und einige Leute es vorziehen, jeden Bereich zu unterscheiden. So oder so ist in Ordnung.

Verwandte Themen