Анонимные функции Javascript в Firefox 7

#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();