#javascript #firefox #anonymous-function
#javascript #firefox #анонимная функция
Вопрос:
После обновления до Firefox 7 я получаю следующую ошибку:
для инструкции функции требуется имя
Эти конкретные функции определяются как
fun = eval("function (item) { //Function body }");
Если я перепишу его как:
fun = eval("function view(item) { //Function body }");
Ошибка больше не отображается, но программа по-прежнему не работает.
Ps.- Я знаю, что вычисление строки — не очень хорошая идея. Это устаревшее приложение, которое я должен исправить, в котором некоторые функции загружаются из базы данных в виде строк по требованию.
Ответ №1:
Заключите это в скобки
eval("(function (item) { alert('hello'); })");
Но это не имеет смысла, поскольку ничего не делает. Может быть, вы хотите:
eval("(function () { alert('hello'); })()");
Или
eval("var func = function (item) { };");
Комментарии:
1. Скрипт фактически оценивает функцию и сохраняет ее в словаре. Итак, ваше первое решение сработало. Спасибо.
2. Нет необходимости
eval
, если тело функции неизвестно при загрузке кода. Просто избавьтесь отeval
всего.
Ответ №2:
Для объявления функции (это то, что у вас есть) требуется идентификатор по спецификации.
function() {
}
точно так же, как это не разрешено спецификацией ES (даже если некоторые браузеры могут разрешить это в любом случае). Анонимным может быть только выражение функции.
Комментарии:
1. В некоторых случаях Firefox обрабатывает то, что может показаться объявлениями безымянных функций, как выражения функций, поэтому немного удивительно, что в этом случае он жалуется. В любом случае, обертывание его в операторе группировки однозначно делает его выражением функции, поэтому имя становится необязательным.
Ответ №3:
просто предположение, может быть, попробовать с:
fun = eval("return function (item) { //Function body }");
(Я только что добавил оператор return)
Ответ №4:
если функция определена как строка, и вы хотите использовать ее, не вызывая eval каждый раз, вы можете сделать это:
var myFunc = 'function(){alert("myFunc");}';
var fun = eval('(function(){return ' myFunc '})()');
fun();
Или просто
var myFunc = 'function(){alert("myFunc");}';
var fun = eval('(' myFunc ')');
fun();