замыкание Компилятор не запрещает " eval ', вы можете продолжать использовать его, если найдете его удобным, но вы должны понимать, что компилятор не пытается понять, что происходит в вашем заявлении eval, и предполагает, что ваш eval является «безопасным»:
function f(x, y) {
alert(eval("y")); // fails: hidden reference to "y"
alert(eval('"'+x+'"')); // might be valid
}
f('me', 'you');
Когда компилятор оптимизирует эту функцию, он пытается удалить «y» и переименовал параметр останова. Это будет первая ошибка eval, поскольку «y» больше не существует. Второй eval исправит отображение предупреждения «я».
Таким образом, с помощью простых оптимизаций вы можете использовать eval для ссылки на глобальные переменные и свойства объекта, поскольку они не переименованы или не удалены (но не локальные).
С оптимизацией ADVANCED это немного сложнее, поскольку компилятор пытается удалить и переименовать глобальные, а также локальные переменные. Поэтому вам нужно экспортировать значения, которые необходимо сохранить. Это также верно, если вы используете строку, чтобы попытаться сослаться на имя другими способами:
var methodName = "myMethod";
(window[methodName])()
или
var methodName = "myMethod";
eval(methodName+"()")
компилятор просто не пытается определить, является ли «имяМетод» является ссылкой к функции. Вот просто пример ADVANCED экспорта режима:
window['myMethod'] = myMethod;
Назначение делает две вещи: она сохраняет функцию MyMethod, если бы в противном случае быть удалены, и это дает ему фиксированное имя, присвоив его свойству с помощью строка. Если вам нужно ссылаться на локальные значения, вам нужно немного сложнее и использовать конструктор Function.Определение "ф" из моего первого примера, который может Eval местных жителей:
var f = new Function("x", "y", "alert(eval('y')); alert(eval('\"' + x + '\"'));");
Вы можете найти эту страницу полезной:
https://developers.google.com/closure/compiler/docs/limitations
А как насчет окна [ "SomeObject.itsMethod"] - похоже, что это не работает? –
@ Vojtěch Предполагая, что 'SomeObject.itsMethod' является строковым именем для функции верхнего уровня, попробуйте окно [SomeObject.itsMethod](); – Matt
Я имел в виду нечто вроде 'var Object = {itsMethod: function() {...}}; var call = "Object.itsMethod"; window [call](); ' –