Как уже неоднократно говорилось, использование конструктора функции считается плохой практикой (см. Также спецификацию языка ECMAScript , 5 th , § 15.3. 2.1):
new Function ([arg1[, arg2[, … argN]],] functionBody)
(где все аргументы - это строки, содержащие имена аргументов, а последняя (или единственная) строка содержит тело функции).
Подводя итог, говорят, что он медленный, как объяснил команда оперы :
Каждый раз […] Function
конструктор вызывается на строку
представляющий исходный код, скрипт
двигатель должен запустить машину, которая
преобразует исходный код в исполняемый файл
код. Обычно это дорого
производительность - легко сто раз
дороже, чем простая функция
позвоните, например. (Марк Тарквин Уилтон-Джонс)
Хотя это не , что плохо, согласно этому посту на MDC (хотя я сам не проверял это, используя текущую версию Firefox).
Крокфорд добавляет , что
[t] он цитирует соглашения
язык делает это очень трудно
правильно выразить тело функции как
строка. В форме строки, рано
проверка ошибок не может быть выполнена. […] А также
это пустая трата памяти, потому что каждый
функция требует своего собственного независимого
осуществление.
Другое отличие состоит в том, что
функция, определенная функцией
конструктор не наследует никакой области видимости
кроме глобальной области видимости (которая все
функции наследуют). ( MDC )
Кроме того, вы должны быть внимательны, чтобы избежать внедрения вредоносного кода при создании new Function
с использованием динамического содержимого.
Тем не менее, T.J. Краудер говорит в ответ , что
[т] здесь почти никогда не нужно
аналогичная […] новая функция (...),
либо, опять же, за исключением некоторых продвинутых
крайние случаи.
Итак, теперь мне интересно: что это за «передовые крайние случаи»? Существуют ли допустимые варианты использования конструктора Function?