2012-07-08 58 views
46

誰花時間在語言如C JavaScript開發人員經常會錯過使用某些類型的內省,如日誌行號的能力,以及用什麼方法被調用當前方法從。那麼如果你使用的是V8(Chrome,Node.js),你可以採用以下方法。訪問行數

回答

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); 

以上將記錄19

arguments.callee.caller相結合,你可以得到更接近有用的日誌記錄您通過宏用C來獲得類型。

+3

https://code.google.com/p/v8/wiki/ JavaScriptStackTraceApi#Customizing_stack_traces具有的V8堆棧跟蹤API可用其他方法的列表。一般名單:獲得OS 3.0,getTypeName,getFunction,getFunctionName,getMethodName,的getFileName,getLineNumber,getColumnNumber,getEvalOrigin,isToplevel,isEval,isNative,isConstructor – zamnuts 2013-05-14 23:02:36

+0

也看到這個答案的一些示例代碼輸出整個跟蹤。 http://stackoverflow.com/questions/6163807/customized-stack-traces-in-google-chrome-developer-tools/10942404#10942404 – 2014-03-20 22:20:29

+0

人們可以在這裏看到一些示例使用該API的:https://github.com /jameswomack/capn/blob/master/test/capn.js – 2014-03-24 10:29:46

-2

顯然這工作太節點或Chrome瀏覽器(可能還有其他)

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 

或:

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

它可以在V8中使用(由Chrome和Node.js使用),如我的帖子標題中所述。 – 2013-01-02 06:50:01

+8

Mike,我想OP是在談論JavaScript – 2014-11-08 11:13:25