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

me trataron arguments.callee y arguments.callee.caller, y sin suerte ...¿Es posible obtener el contexto de la persona que llama en javascript?

+0

¿Qué quiere decir con "contexto de llamadas"? Tal vez te refieres al valor de su * esta * palabra clave? – RobG

+0

@ RobG, en mi ejemplo, debería ser la palabra clave 'window', effectually' this' en el sitio de llamadas. –

+0

test.demo.call (ventana); – cycaHuH

Respuesta

36

Desde this referes de palabras clave para ThisBinding en un LexicalEnvironment, y javascript (o ECMAScript) no permite el acceso mediante programación a LexicalEnvironment (de hecho, hay acceso programático al total Execution Context), por lo que es imposible para obtener el contexto de la persona que llama.

Además, cuando intenta test.demo() en un contexto global, no debería haber llamadas sin en absoluto, ni un contexto adjunta a la persona que llama, esto es sólo un código Global , no un contexto de llamada .

+0

+1 Tiene perfecto sentido – Sarfraz

+1

@ otakustay-Eres completamente correcto al no poder hacer referencia a las variables como propiedades de otros objetos variables. Pero como un caso especial, las variables globales se convierten en propiedades del objeto global, por lo que puede acceder a variables en el contexto de llamada ** si ** es global. Puede probar la propiedad 'arguments.callee.caller '(obsoleta, no estándar) y si es' null' suponer que la llamada es de código global, entonces espero que no esté en el modo estricto ES5, obtenga una referencia al objeto global e ir desde allí. – RobG

+0

Aquí es donde tiene problemas con Node.JS y módulos. – Qix

4

El valor de la palabra clave this de una función lo establece la llamada, no es "context". Las funciones tienen un contexto de ejecución, que incluye su este valor. No está definido por this.

En cualquier caso, dado que todas las funciones tienen una variable this que es una propiedad de su objeto variable, no se puede hacer referencia a ninguna otra palabra clave this a menos que se pase a la función. No puedes acceder directamente al objeto variable; depende de la resolución de la variable en la cadena de alcance, por lo que this siempre será el contexto de ejecución actual this.

8

Por contexto, supongo que quiere decir this? Eso depende de cómo se invoca la función, no de dónde se invoca.

Por ejemplo (usando una consola 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 está en desuso.

Cuestiones relacionadas