访问V8 JavaScript中的行号(Chrome和Node.js)
花时间使用C语言的JavaScript开发人员往往会错过使用某些types的自省的能力,比如logging行号,以及当前方法被调用的方法。 那么如果你使用的是V8(Chrome,Node.js),你可以使用下面的代码。
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);
以上将logging19
。
结合arguments.callee.caller
你可以更接近于通过macros获取C的有用日志types。
显然这也适用于节点或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