четверг, 26 мая 2011 г.

JavaScript eval - передаем данные в вызов

Экспериментировал с qooxdoo и обнаружил неприятную для себя вещь.
Вот этот код работает для source версии, и не работает для build версии:


var qqq = 'qqq'; eval('alert(qqq)');


Оказалось все просто, при генерации build имена переменных хаотично меняются с целью оптимизации. Первым позывом было найти, как отключить оптимизацию. Потом вроде наступило прояснение, которое привело к такому варианту решения проблемы:


var qqq = 'qqq'; eval('(function (a) { alert(a); })')(qqq);


Этот простой трюк позволил работать и build версии, и мне стало казаться, что такой вариант в целом правильнее (насколько может быть правильным использование eval отдельный вопрос).

UPDATE: Оказалось, что я глубоко неправ. Даже когда мой код заработал - это было полдороги. Ведь есть еще IE. Так вот, писать надо как выяснилось вот так:
var f = new Function('a', 'alert(a)');
f('qqq');

А вот тут можно почерпнуть полезную информацию: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function

Комментариев нет: