Динамическое создание переменных, собственная область видимости, как выполнить функцию в песочнице?

Есть необходимость выполнять анонимную функцию (на клиенте) в ограниченной области видимости с собственными переменными окружения (без доступа к глобальным переменным).
Переопределение контекста 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?

Заранее спасибо.
  • Вопрос задан
  • 3277 просмотров
Пригласить эксперта
Ответы на вопрос 1
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
Не совсем понимаю, чего вы добиваетесь...
var global = 'А вот и я';

function sandbox(f) {
	eval("(function(){'use strict';var window, document;(" + f.toString() + ").call({});})()");
}
sandbox(function(){
	console.log(window, document, this, global); //И global прекрасно попадает в замыкание
});

То есть, избавившись от ссылок на window, document и указав объектом активации то, что нужно, мы всё равно имеем все глобальные переменные в замыкании.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы