Книга: JavaScript. Подробное руководство, 6-е издание

8.7.6. Конструктор Function()

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), которая определяет новые переменные и функции в своей собственной области видимости. Вам редко придется использовать этот конструктор в своих программах.

Оглавление книги


Генерация: 0.675. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз