8.7.6. Конструктор Function()
Функции обычно определяются с помощью ключевого слова function либо в форме инструкции объявления функции, либо в форме выражения-литерала. Однако функции могут также определяться с помощью конструктора Function(). Например:
var f = new Function("x", "у", "return x*y;");
Эта строка создаст новую функцию, которая более или менее эквивалентна функции, объявленной с помощью более привычного синтаксиса:
var f = function(x, у) { return х*у; }
Конструктор Function() принимает произвольное число строковых аргументов. Последний аргумент должен содержать текст с телом функции; он может включать произвольное число инструкций на языке JavaScript, разделенных точкой с запятой. Все остальные аргументы конструктора интерпретируются как имена параметров функции. Чтобы создать функцию, не имеющую аргументов, достаточно передать конструктору всего одну строку - тело функции.
Примечательно, что конструктору Function() не передается никаких аргументов, определяющих имя создаваемой функции. Подобно литералам функций, конструктор Function() создает анонимные функции.
Есть несколько моментов, связанных с конструктором Function(), о которых следует упомянуть особо:
• Конструктор Function() позволяет динамически создавать и компилировать функции в процессе выполнения программы.
• При каждом вызове конструктор Function() выполняет синтаксический анализ тела функции и создает новый объект функции. Если вызов конструктора производится в теле цикла или часто вызываемой функции, это может отрицательно сказаться на производительности программы. Напротив, вложенные функции и выражения определения функций внутри циклов не компилируются повторно.
• И последний, очень важный момент: когда функция создается с помощью конструктора Function(), не учитывается лексическая область видимости - функции всегда компилируются как глобальные функции, что наглядно демонстрирует следующий фрагмент:
var scope = "глобальная";
function constructFunction() {
var scope = "локальная";
return new Function("return scope”); // Здесь не используется
// локальная область видимости!
} ;
// Следующая строка вернет "глобальная", потому что функция, возвращаемая
// конструктором Function(), является глобальной.
constructFunction()(); // => "глобальная"
Точнее всего конструктор Function() соответствует глобальной версии eval() (раздел 4.12.2), которая определяет новые переменные и функции в своей собственной области видимости. Вам редко придется использовать этот конструктор в своих программах.
Больше книг — больше знаний!
Заберите 30% скидку новым пользователям на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ