Есть необходимость выполнять анонимную функцию (на клиенте) в ограниченной области видимости с собственными переменными окружения (без доступа к глобальным переменным).
Переопределение контекста this не проблема, а вот с переменными мне видится лишь один вариант - это eval. Но так как eval следует оставлять на самый край, решил поинтересоваться у сообщества, нет ли иных вариантов решения проблемы.
Собственно задача:
function sandbox(fn){ // реализация с помощью eval'а
fn = fn.toString();
// необходимо динамически создать переменные внутри fn
fn = ' (function(){"use strict"; var window, document; (' + fn + ').call(this);}) ';
fn = eval(fn);
fn.call({}); // например
}
sandbox(function(){
console.log(window, document, this); // вернет undefined, undefined, Object {}
});
За предопределение переменных должна отвечать функция sandbox. То бишь вариант с явным переопределением переменных внутри передаваемой функции не предлагать. Варианты с динамическим созданием фрейма с собственным окружением, как и передача переменных параметрами в функцию
(function(window, document){...})(null, null)
тоже не подходят, ибо это и так все очевидно, а в здесь необходима динамизация этого процесса функцией sandbox.
Есть иные пути решения без использования eval?
Заранее спасибо.