Quiero evaluar todas las variables dentro de una función antes de convertir la función en una cadena.
Ejemplo:
const x = "5"; function someFunc(){ console.log(x); } someFunc.toString()
Producción:
function someFunc(){ console.log(x); }
Rendimiento esperado:
function someFunc(){ console.log("5"); }
Necesito que funcione dinámicamente para cualquier número de variables y cualquier función sin conocer primero la función o las variables. Prefiero una solución basada en metaprogramación como la reflexión, pero cualquier solución que funcione es buena, incluida Regex.
¿Alguna idea sobre cómo implementar eso?
No creo que esto sea posible, al menos no exactamente como lo describe.
El bloqueador clave es que no hay forma de obtener una lista de todas las variables actualmente visibles o sus valores.
Entonces, en el mejor de los casos, tendría que cambiar un poco el escenario: comience leyendo un archivo (u otra cadena) que contenga el código fuente que desea procesar. A continuación, utilice un analizador de JavaScript (p. ej., Esprima; sin respaldo, solo ilustración) para obtener un AST (árbol de sintaxis abstracta). Luego, puede hacer las transformaciones que desee en ese AST (como: reemplazar variables constantes con su valor) y luego convertir el AST nuevamente en una cadena (que luego puede escribir en un archivo, si lo desea).
Lo anterior debería funcionar para casos simples como el ejemplo que diste. Sin embargo, cuando mira escenarios más complicados, se encontrará con obstáculos y limitaciones. Por ejemplo:
const x = 5; function Case1() { let y = x; if (someCondition()) y++; console.log(y); // what now? } function Case2() { for (let i = 0; i < x; i++) { console.log(i); // what now? } } function Case3() { const y = {foo: 42, valueOf() { return "null"; }}; console.log(y); // what now? } function Case4() { const y = Math.random() > 0.5 ? "yes" : "no"; console.log(y); // what now? }
Estoy seguro de que hay muchas más situaciones en las que esta idea es difícil de poner en práctica.
No dijiste cuál es tu objetivo final, y esto huele a una pregunta xy . ¿Está buscando oportunidades de optimización? ¿Un entorno de depuración? Sospecho firmemente que hay una manera más fácil de lograr cualquiera que sea su objetivo real.
(Además, esto no tiene nada que ver con V8, libuv o Node.js; colocaré etiquetas en consecuencia).
const x = 5; function someFunc(){ // do something with x return x; } someFunc().toString();
O
const x = 5; function someFunc(){ // do something with x return x.toString(); } someFunc();