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