Разработчики JavaScript, которые проводили время на таких языках, как C, часто пропускают возможность использования определенных типов интроспекции, таких как номера строк ведения журнала и метод, из которого был вызван текущий метод. Хорошо, если вы используете V8 (Chrome, Node.js), вы можете использовать следующее.
Доступ к номеру строки в JavaScript V8 (Chrome & Node.js)
Ответ 1
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 через макросы.
Ответ 2
По-видимому, это работает и в браузере node или 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