2012-07-08 13 views
46

Gli sviluppatori JavaScript che hanno trascorso del tempo in linguaggi come C spesso non riescono a utilizzare determinati tipi di introspezione, come i numeri di riga di registrazione e il metodo con cui è stato richiamato il metodo corrente a partire dal. Bene, se usi V8 (Chrome, Node.js) puoi utilizzare quanto segue.Accesso al numero di riga in V8 JavaScript (Chrome & Node.js)

risposta

77
Object.defineProperty(global, '__stack', { 
    get: function(){ 
    var orig = Error.prepareStackTrace; 
    Error.prepareStackTrace = function(_, stack){ return stack; }; 
    var err = new Error; 
    Error.captureStackTrace(err, arguments.callee); 
    var stack = err.stack; 
    Error.prepareStackTrace = orig; 
    return stack; 
    } 
}); 

Object.defineProperty(global, '__line', { 
    get: function(){ 
    return __stack[1].getLineNumber(); 
    } 
}); 

console.log(__line); 

Quanto sopra registrerà 19.

In combinazione con arguments.callee.caller è possibile avvicinarsi al tipo di registrazione utile che si ottiene in C tramite macro.

+3

https://code.google.com/p/v8/wiki/ JavaScriptStackTraceApi # Customizing_stack_traces ha un elenco di altri metodi disponibili nell'API StackTrace v8. Un elenco generale: getThis, getTypeName, getFunction, getFunctionName, getMethodName, getFileName, getLineNumber, getColumnNumber, getEvalOrigin, isToplevel, isEval, isNative, isConstructor – zamnuts

+0

Vedere anche questa risposta per alcuni esempi di codice per generare l'intera traccia. http://stackoverflow.com/questions/6163807/customized-stack-traces-in-google-chrome-developer-tools/10942404#10942404 –

+0

Si può vedere qualche esempio di utilizzo di questa API qui: https://github.com /jameswomack/capn/blob/master/test/capn.js –

-2

a quanto pare questo funziona anche nel nodo o browser Chrome (possibilmente altri pure)

line = (o) -> 
    b = Error.prepareStackTrace 
    Error.prepareStackTrace = (_, stack) -> stack 
    e = new Error 
    Error.captureStackTrace e, o 
    s = e.stack 
    Error.prepareStackTrace = b 
    s[1].getLineNumber() 

console.log line this 

o:

lineNumber=(o)->E=Error;p='prepareStackTrace';b=E[p];E[p]=((_,s)->s);e=new E;E.captureStackTrace e,o;s=e.stack;E[p]=b;s[1].getLineNumber() 

console.log lineNumber this 
+1

Funziona con V8 (usato da Chrome e Node.js) come menzionato nel titolo del mio post. –

+8

Mike, penso che l'OP stia parlando di JavaScript –

Problemi correlati