var foo = (function(){
var x = "bar";
return function(){
console.log(x);
};
})();
console.log(foo.toString()); // function() {console.log(x);}
(foo)(); // 'bar'
eval('(' + foo.toString()+')()')); // error: x is undefined
C'è una tecnica per la risoluzione (modifica) di una funzione, in modo da riferimenti dal campo di applicazione esterno diventano riferimenti locali, come:risolvere i riferimenti esterno portata in una funzione javascript per la serializzazione
function() {console.log(x);}
diventa:
function() {console.log("bar");}
La funzione può ora essere modificata e trasportata su una rete ed eseguita in un altro runtime.
Forse si potrebbe analizzare la funzione in un Abstract Syntax Tree e quindi modificarlo? Il riferimento sarà sempre fuori portata (non disponibile), giusto?
Obiettivo:
sto serializzazione una funzione di filtro da un runtime nodo ad un runtime postgresql plv8. In questo momento la funzione filtro ha un'interfaccia: dbClient.filter ((row, age) => row.age> age), ageFromOuterScope) .then (matches => ...)
Voglio interfaccia dbClient.filter ((row) => row.age> age)). then (matches => ...), dove age è un riferimento dall'ambito esterno.
Aggiornamento:
posso solo immaginare una soluzione. Analizzare la funzione, individuare i riferimenti alle variabili fuori della funzione, e quindi riscrivere la funzione originale:
function(row) {
return row.age > age
}
Per:
function(row, age) {
return row.age > age
}
variabili rilevate dovrebbero essere aggiunti a una stringa che rappresenta una matrice, come :
var arrayString = '[age]'
E poi eval la stringa:
var functionArgs = eval(arrayString)
E infine:
dbClient.filter(modifiedFunction, ...functionArgs).then(matches => ...)
La maggior parte delle volte tali variabili vengono modificate in fase di runtime, quindi tali conversioni cambierebbero il comportamento del codice. –
Due commenti: uno, questo è fuori tema per Stack Overflow dal momento che richiede una libreria. Due, non è così che funziona lo scoping in Javascript, né dovrebbe, ed è per questo che non funziona per te. Dal momento che non funziona in questo modo, in che modo una tecnica potrebbe prevedere correttamente come prendere questa decisione? Questo a sua volta rende la domanda ampia per Stack Overflow. –
Ho modificato la domanda. Che ne dici di usare AST? – Jacob