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
Существует ли способ разрешения (изменения) функции, чтобы ссылки из внешней области действия становились локальными ссылками, например:
function() {console.log(x);}
становится:
function() {console.log("bar");}
Теперь функцию можно преобразовать в строку, передать по сети и выполнить в другой среде выполнения.
Может быть, можно разобрать функцию на абстрактное синтаксическое дерево, а затем изменить ее? Ссылка всегда будет вне области действия (недоступна), верно?
Цель:
Я сериализую функцию фильтра из среды выполнения узла в среду выполнения postgresql plv8. Прямо сейчас функция фильтра имеет интерфейс: dbClient.filter((row, age) => row.age > age), ageFromOuterScope).then(matches => ...)
Мне нужен интерфейс dbClient.filter((row) => row.age > age)).then(matches => ...), где age является ссылкой из внешней области.
Обновление:
Я могу представить только одно решение. Проанализируйте функцию, найдите ссылки на переменные вне функции, а затем перепишите исходную функцию:
function(row) {
return row.age > age
}
To:
function(row, age) {
return row.age > age
}
Обнаруженные переменные также должны быть добавлены в строку, представляющую массив, например:
var arrayString = '[age]'
И затем оцените строку:
var functionArgs = eval(arrayString)
И наконец:
dbClient.filter(modifiedFunction, ...functionArgs).then(matches => ...)