Los números de línea de seguimiento de la pila de Javascript para el código dentro new Function están apagados por 2:
const fn = new Function(` // line 1 try { // line 2 blah // line 3 } catch(e) { // line 4 return e.stack // line 5 } // line 6 `) console.log(fn())Ejecutar el fragmento anterior produce:
anonymous@https://stacksnippets.net/js line 12 > Function:5:5 donde debería decir Function:3:5 . Lo mismo cuando se ejecuta en el nodo:
$ cat stack-trace-line-nums.js const fn = new Function(` // line 1 try { // line 2 blah // line 3 } catch(e) { // line 4 return e.stack // line 5 } // line 6 `) console.log(fn()) $ node stack-trace-line-nums.js ReferenceError: blah is not defined at eval (eval at <anonymous> (/tmp/stack-trace-line-nums.js:1:12), <anonymous>:5:5) ...La forma más obvia de demostrarlo es poner todo el código en la misma línea:
const fn = new Function('try { blah } catch(e) { return e.stack }') console.log(fn())que produce:
anonymous@https://stacksnippets.net/js line 12 > Function:3:7 en lugar de Function:1:7 .
¿Alguna idea de cuál es la causa o si hay una solución?
Registre la función en sí y verá lo que está pasando:
const fn = new Function(` // line 1 try { // line 2 blah // line 3 } catch(e) { // line 4 return e.stack // line 5 } // line 6 `) console.log(fn); console.log(fn())En realidad se convierte en:
function anonymous( ) { // line 1 try { // line 2La primera línea es la definición de la función, la segunda línea es el final de la lista de parámetros y el comienzo del bloque, y solo en la línea 3 se inserta el cuerpo real de la función pasada al constructor.
Entonces, solo agregue 2 al número de línea cada vez.