Подтвердить что ты не робот

Доступ к номеру строки в JavaScript V8 (Chrome & Node.js)

Разработчики JavaScript, которые проводили время на таких языках, как C, часто пропускают возможность использования определенных типов интроспекции, таких как номера строк ведения журнала и метод, из которого был вызван текущий метод. Хорошо, если вы используете V8 (Chrome, Node.js), вы можете использовать следующее.

4b9b3361

Ответ 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