2011-09-16 10 views
5

Tengo una función que se rompe en algún lugar de la línea 1433 de ExtJS.Obtener el alcance de la función que llama

var createDelayed = function(h, o, scope){ 
console.log(arguments); //logs undefined all round. 
    return function(){ 
     var args = Array.prototype.slice.call(arguments, 0); 
     setTimeout(function(){ 
      h.apply(scope, args); 
     }, o.delay || 10); 
    }; 
}; 

¿Hay alguna manera de ver en qué línea se ejecuta una función, desde dentro de ella?

(ya que es una tercera lib partido, y yo realmente no podemos hacer

var me =this; 

log me)

+3

Firebug. Punto de interrupción Stack trace Eso es todo. –

+0

Por alguna razón divertida firebug no estaba interesado en darme un rastro de pila. – Alex

+0

¡Cambia de opinión! –

Respuesta

10

Hay arguments.callee.caller, que se refiere a la función que llamó a la función en la que se accede a que propiedad. arguments.callee es la función en sí misma.

No hay forma de obtener el alcance de la función original sin pasarla. En el siguiente ejemplo, no se puede determinar el valor this dentro foo (aparte de saber que no hay nada suceda especial con this aquí):

function foo() { 
    bar(); 
} 

function bar() { 
    console.log(arguments.callee);  // bar function 
    console.log(arguments.callee.caller); // foo function 
} 

foo(); 

Documentation


para conseguir las cosas número de línea se vuelve más complicado , pero puede arrojar un error y observar el seguimiento de la pila: http://jsfiddle.net/pimvdb/6C47r/.

function foo() { 
    bar(); 
} 

function bar() { 
    try { throw new Error; } 
    catch(e) { 
     console.log(e.stack); 
    } 
} 

foo(); 

Para el violín, registra algo similar a lo siguiente en Chrome, en el que el extremo de la línea dice que el número de línea y posición de carácter:

Error 
    at bar (http://fiddle.jshell.net/pimvdb/6C47r/show/:23:17) 
    at foo (http://fiddle.jshell.net/pimvdb/6C47r/show/:19:5) 
    at http://fiddle.jshell.net/pimvdb/6C47r/show/:29:1 
Cuestiones relacionadas