2015-01-11 11 views
7

Anche le funzioni in javascript sono un oggetto e possono avere proprietà. Quindi esiste un modo per accedere alle sue proprietà dall'interno del proprio corpo di funzioni?Accesso alle proprietà dell'oggetto della funzione dall'interno del corpo della funzione

come questo

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

Uh, basta usare 'f.a'? – Bergi

+0

Bene, il tuo esempio usa un riferimento, quindi ottieni le risposte di conseguenza. – tishma

risposta

1

arguments.callee è la funzione stessa e non viene influenzata dal nome della funzione.

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

Ottima risposta! Credo che questo sia l'approccio più pulito. Nella risposta di torazaburo, l'associazione della funzione a se stessa perde il riferimento del suo genitore quando si utilizza 'questo' e la risposta di Christos non funziona se la funzione non ha un identificatore (es. Funzione anonima) – Daniel

+0

Tuttavia quando si utilizza questo approccio in ricorsiva modi, il valore di 'this' sarà diverso per ogni chiamata, il primo sarà il genitore della funzione, i successivi saranno gli argomenti proprietà della chiamata precedente, poiché dovremmo chiamare la funzione da argomenti object, usando argomenti .callee, dovremmo usare arguments.callee.apply (questo)! – Daniel

+0

Ma per il vero scopo di questa domanda, è davvero la migliore risposta! – Daniel

2

Si potrebbe utilizzare questo:

console.log(f.a); 

Se f viene eseguito, f(), prima di f.a = 'Test'; si otterrà undefined nella console, dal momento che non v'è alcuna proprietà con nome/chiave a essere definito. Dopo l'esecuzione del f.a = 'Test';, il nome/tasto a verrà definito su f e il valore corrispondente sarà 'Test'. Quindi, eseguendo in seguito la funzione f, il valore 'Test' sarebbe l'output per la console.

0

Prototypes è quello che stai cercando.

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

F.prototype.a = 'Test'; 

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

Spero che questo aiuti!

+0

grazie, ma quello che voglio chiedere è di accedere alle proprietà della funzione stessa invece delle proprietà del prototipo – KwiZ

2

Il modo classico di fare questo è quello di legare la funzione a se stesso, dopo di che si può accedere le sue proprietà tramite this:

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

È possibile impostare questa funzione utilizzando un IIFE :

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

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

si noti che non c'è bisogno di usare f (o anche una dichiarazione di funzione) per far funzionare correttamente:

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

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

Alcune persone piace usare la stessa variabile in tutto per sottolineare che l'interno f finirà per diventare l'esterno f, e alcune persone preferiscono per distinguere ogni ambito. Va bene comunque.