2012-07-08 39 views
46

Nhà phát triển JavaScript đã dành thời gian bằng các ngôn ngữ như C thường bỏ lỡ khả năng sử dụng một số loại nội tâm nhất định, như số dòng ghi nhật ký và phương thức hiện tại được gọi từ. Vâng, nếu bạn đang sử dụng V8 (Chrome, Node.js), bạn có thể sử dụng như sau.Truy cập số dòng trong V8 JavaScript (Chrome & Node.js)

Trả lời

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

Ở trên sẽ ghi nhật ký 19.

Kết hợp với arguments.callee.caller bạn có thể đến gần hơn với loại đăng nhập hữu ích mà bạn nhận được trong C qua macro.

+3

https://code.google.com/p/v8/wiki/ JavaScriptStackTraceApi # Customizing_stack_traces có một danh sách các phương thức khác có sẵn trong API StackTrace v8. Một danh sách chung: getThis, getTypeName, getFunction, getFunctionName, getMethodName, getFileName, getLineNumber, getColumnNumber, getEvalOrigin, isToplevel, isEval, isNative, isConstructor – zamnuts

+0

Xem thêm câu trả lời này cho một số mã mẫu để xuất toàn bộ dấu vết. http://stackoverflow.com/questions/6163807/customized-stack-traces-in-google-chrome-developer-tools/10942404#10942404 –

+0

Bạn có thể xem một số ví dụ về cách sử dụng API này tại đây: https://github.com /jameswomack/capn/blob/master/test/capn.js –

-2

dường như làm việc này quá trong nút hoặc trình duyệt chrome (có thể là người khác cũng)

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 

hay:

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

Nó hoạt động trong V8 (được sử dụng bởi Chrome và Node.js) sử dụng như đã đề cập trong tiêu đề bài đăng của tôi. –

+8

Mike, tôi nghĩ OP đã nói về JavaScript –

Các vấn đề liên quan