2012-03-13 11 views
36
var test = { 
    demo: function(){ 
     //get the caller context here 
    } 
} 
//when this gets called, the caller context should be window. 
test.demo(); 

ho cercato arguments.callee e arguments.callee.caller, e senza fortuna ...È possibile ottenere il contesto del chiamante in javascript?

+0

Cosa intendi per "contesto del chiamante"? Forse intendi il valore della sua * questa * parola chiave? – RobG

+0

@ RobG, nel mio esempio, dovrebbe essere 'window', effectually' this' keyword nel sito di chiamata. –

+0

test.demo.call (finestra); – cycaHuH

risposta

36

Dal this referes parole chiave per ThisBinding in un LexicalEnvironment, e javascript (o ECMAScript) non consente l'accesso programmatico a LexicalEnvironment (in realtà, non accesso programmatico all'intero Execution Context), quindi è impossibile per ottenere il contesto del chiamante.

Inoltre, quando si tenta test.demo() in un contesto globale, non ci dovrebbe essere senza chiamante affatto, né un contesto attaccato al chiamante, questo è solo un codice mondiale , non un contesto di chiamata .

+0

+1 Ha perfettamente senso – Sarfraz

+1

@ otakustay-Sei assolutamente corretto sul non essere in grado di fare riferimento a variabili come proprietà di altri oggetti variabili. Ma come caso speciale, le variabili globali sono proprietà dell'oggetto globale, quindi puoi in effetti accedere alle variabili nel contesto di chiamata ** se ** è globale. È possibile testare la proprietà 'arguments.callee.caller' (deprecata, non standard) e se è' null' si assume che la chiamata provenga da un codice globale, quindi sperare di non essere nella modalità rigorosa ES5, ottenere un riferimento al oggetto globale e andare da lì. – RobG

+0

Qui si incontrano problemi con Node.JS e moduli. – Qix

4

Il valore della parola chiave this di una funzione è impostato dalla chiamata, non è "contesto". Le funzioni hanno un contesto di esecuzione, che include il valore di questo valore. Non è definito da this.

In ogni caso, poiché tutte le funzioni hanno una variabile this che è una proprietà del suo oggetto variabile, non è possibile fare riferimento ad alcuna altra parola chiave this nell'ambito, a meno che non venga passata alla funzione. Non è possibile accedere direttamente all'oggetto variabile; si dipende dalla risoluzione variabile sulla catena dell'ambito, pertanto this corrisponderà sempre al contesto di esecuzione corrente this.

8

In base al contesto, suppongo che intenda lo this? Dipende da come viene invocata la funzione, non da dove viene invocata.

Ad esempio (utilizzando una console Webkit):

var test = { 
    demo: function() { 
     console.log(this); 
    } 
} 
test.demo(); // logs the "test" object 
var test2 = test.demo; 
test2();  // logs "DOMWindow" 
test.demo.apply("Cheese"); // logs "String" 

Incidentalmente, arguments.caller è obsoleto.

Problemi correlati