JavaScript позволяет определять функции в виде функциональных литералов. Как говорилось в главе 3, функциональный литерал – это выражение, определяю_ щее неименованную функцию. Синтаксис функционального литерала во многом напоминает синтаксис инструкции function, за исключением того, что он ис_
1 Различные реализации JavaScript могут иметь менее строгие требования к опреде_ лениям функций, чем указано в стандарте. Например, реализации Netscape Java_ Script 1.5 допускают наличие «условных определений функций» внутри инструк_ ций if.
142 Глава 8. Функции
пользуется как выражение, а не как инструкция, и ему не требуется имя функ_ ции. Следующие две строки кода определяют две более или менее идентичные функции с помощью инструкции function и функционального литерала:
function f(x) { return x*x; } // инструкция function var f = function(x) { return x*x; }; // функциональный литерал
Функциональные литералы создают неименованные функции, но синтаксис до_ пускает указание имени функции, что может пригодиться при написании ре_ курсивных функций, вызывающих самих себя. Например:
var f = function fact(x) { if (x <= 1) return 1; else return x*fact(x _1); };
Эта строка кода определяет неименованную функцию и сохраняет ссылку на нее в переменной f. Она на самом деле не создает функцию с именем fact, но позво_ ляет телу функции ссылаться с помощью этого имени на саму себя. Заметим, од_ нако, что именованные функциональные литералы до версии JavaScript 1.5 ра_ ботали не вполне корректно.
Функциональные литералы создаются JavaScript_выражениями, а не инструк_ циями, и потому могут использоваться более гибко. Это особенно подходит для функций, которые вызываются только один раз и не должны иметь имени. На_ пример, функция, определенная с помощью выражения функционального лите_ рала, может быть сохранена в переменной, передана другой функции или даже вызвана непосредственно:
f[0] = function(x) { return x*x; }; // Определить и сохранить функцию в переменной a.sort(function(a,b){return a_b;}); // Определить функцию; передать ее другой функции var tensquared = (function(x) {return x*x;})(10); // Определить и вызывать