Я пишу простую реализацию REPL (Read, Evaluate, Print, Loop) в JavaScript. Я могу выделить код и призывающую контекст следующим образом:Как предотвратить случайное загрязнение глобального пространства имен с помощью javascript eval?
var sandbox = {
// Allow the input code to use predefined helper functions
// without the preceding use of the this keyword.
helper_fn: function() { alert("foo"); }
};
var func = new Function("with (this) { " + user_inputed_code + " }");
func.call(sandbox);
Теперь закрывает user_inputed_code
, так что this
Referers к sandbox
и если введенный код обращается или мутирует this
она влияет на sandbox
.
Однако я заметил, что если вмененный код должен был случайно забыть предварять присвоение переменной ключевым словом var
, то глобальное пространство имен будет загрязнено.
Есть ли вообще предотвратить это? Если да, то как (может быть, регулярное выражение?)? Есть ли лучший способ приблизиться к этому?
Можете ли вы * Eval * код в отдельном фрейме или окне, которое имеет отдельный * глобальный * объект ? Кстати, в ECAMScript «контекст» используется в отношении [* контекста исполнения *] (http://www.ecma-international.org/ecma-262/5.1/#sec-10.3). Конкретный параметр * этого * контекста выполнения - это только одна небольшая часть «контекста», которая относится ко всем параметрам и переменным, цепочке цепей и т. Д. – RobG
Я планирую использовать это в проекте Titanium. Поэтому кадры недоступны. Однако замораживание может работать. Должен увидеть, поддерживает ли среда выполнения. – Sukima
Можете ли вы запустить код в строгом режиме? Таким образом, назначение необъявленным переменным вызовет ошибку. Вы не можете использовать * с *. И пользователи все равно могут создавать глобальные переменные, используя 'window.foo = ...'. – RobG