// Функция-генератор, возвращающая f(х) для каждого элемента х итерируемого объекта і
function map(і. f) {
fоr(let x in і) yield f(x);
}
Выражения-генераторы позволяют избежать необходимости создавать или использовать такую функцию map. Чтобы получить новый генератор h, возвращающий f (х) для каждого значения х, возвращаемого генератором g, достаточно использовать такой программный код:
let h = (f(x) for (x in g));
Используя
генератор eachline из примера 11.1, можно реализовать отсечение пробельных символов, а также фильтрацию комментариев и пустых строк, как показано ниже:
let lines = eachline(text);
let trimmed = (l.trim for (1 in lines));
let nonblank = (1 for (1 in trimmed) if (1.length > 0 && 1[0]!='#'));
появилась возможность краткой записи простых функций (называется «лексическим замыканием»). Если функция вычисляет единственное выражение и возвращает его значение, ключевое слово
return
и фигурные скобки, окружающие тело функции, можно опустить и просто поместить выражение сразу после списка аргументов. Например:
24
На момент написания этих строк данная особенность не поддерживалась в Rhino.
let succ = function(x) х+1, yes = function true, no = function false;
Это просто и удобно: функции, определяемые таким способом, ведут себя как обычные функции, в определении которых присутствуют фигурные скобки и ключевое слово
return
. Этот сокращенный синтаксис удобно использовать, в частности, при передаче функций другим функциям. Например:
// Отсортировать массив в обратном порядке
data.sort(function(a,b) b-a);
// Определение функции, которая возвращает сумму квадратов элементов массива
и вычисляется условное выражение. Если оно возвращает
true
, выполняется тело этого блока
catch
, а все остальные блоки
catch
пропускаются. Если блок
catch
не имеет условного выражения, он ведет себя как блок с условным выражением
if true
и выполняется всегда, если перед ним не был встречен блок
catch
, удовлетворяющий условию. Если условное выражение присутствует во всех блоках
catch
и ни в одном из них условное выражение не вернуло
true
, исключение продолжит распространение как необработанное. Обратите внимание, что, поскольку условное выражение уже находится в круглых скобках блока
catch
, его не требуется еще раз заключать в скобки, как в обычных инструкциях
if
.
11.7. Е4Х: ECMAScript for XML
Расширение ECMAScript for XML, более известное как E4X, - это стандартное расширение [25] JavaScript, определяющее ряд мощных особенностей для обработки XML-документов. Расширение Е4Х поддерживается интерпретаторами Spider-monkey 1.5 и Rhino 1.6. Из-за того что оно не получило широкой поддержки у производителей броузеров, расширение Е4Х, вероятно, лучше относить к серверным технологиям, основанным на интерпретаторах Spidermonkey или Rhino.
25
Расширение Е4Х определяется стандартром ЕСМА-357. Официальную спецификацию можно найти по адресу: http//www.ecma-interational.org/publications/standarts/Ecma-357.htm
Расширение Е4Х представляет XML-документ (или элементы и атрибуты XML-документа) как объект XML, и представляет фрагменты XML (несколько элементов XML, не имеющих общего родителя) в виде родственного объекта XMLList. В этом разделе мы познакомимся с несколькими способами создания и обработки объектов XML. Объекты XML - это совершенно новый тип объектов, для работы с которыми в Е4Х предусмотрен (как мы увидим) специальный синтаксис. Как известно, для всех стандартных объектов JavaScript, не являющихся функциями, оператор
typeof
возвращает строку «
object
». Объекты XML, подобно функциям, отличаются от обычных объектов JavaScript, и для них оператор
typeof
возвращает строку "xml". Важно понимать, что объекты XML никак не связаны с объектами DOM (Document Object Model - объектная модель документа), которые используются в клиентском JavaScript (глава 15). Стандарт Е4Х определяет дополнительные средства для преобразования XML-документов и элементов между представлениями Е4Х и DOM, но броузер Firefox не реализует их. Это еще одна причина, почему расширение Е4Х лучше относить к серверным технологиям.
Этот раздел представляет собой краткое учебное руководство по расширению Е4Х и не должен рассматриваться как полноценное его описание. В частности, объекты XML и XMLList имеют множество методов, которые вообще не будут упоминаться здесь. Их описание также отсутствует в справочном разделе. Тем из вас, у кого появится желание использовать расширение Е4Х, за более полной информацией необходимо обращаться к официальной спецификации.
Расширение Е4Х определяет совсем немного новых синтаксических конструкций. Самая заметная часть нового синтаксиса заключается в возможности использования разметки XML непосредственно в программном коде JavaScript и включения в него литералов XML, как показано ниже: