Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание
- Название:JavaScript. Подробное руководство, 6-е издание
- Автор:
- Жанр:
- Издательство:Символ-Плюс
- Год:2012
- Город:СПб
- ISBN:978-5-93286-215-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание краткое содержание
Эта книга - одновременно и руководство программиста, и полноценный справочник по базовому языку JavaScript и клиентским прикладным интерфейсам, предоставляемым веб-броузерами.
JavaScript. Подробное руководство, 6-е издание - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
*********************************************************
Пример 8.1. Определения JavaScript-функций
// Выводит имена и значения всех свойств объекта о. Возвращает undefined,
function printprops(o) {
for(var p in o)
console.log(p + ": " + o[p] + "\n");
}
// Вычисляет Декартово расстояние между точками (х1,у1) и (х2,у2).
function distance(x1, у1. х2, у2) {
var dx = х2 - х1; var dy = у2 - у1;
return Math.sqrt(dx*dx + dy*dy);
}
// Рекурсивная функция (вызывающая сама себя), вычисляющая факториал
// Напомню, что х! - это произведение х и всех положительных целых чисел, меньше X.
function factorial(x) {
if (х <= 1) return 1;
return x * factorial(x-1);
}
// Следующее выражение определяет функцию, вычисляющую квадрат аргумента.
// Обратите внимание, что она присваивается переменной
var square = function(x) { return x*x; }
// Выражения определения функций могут иметь имена, что позволяет
// производить рекурсивные вызовы.
var f = function fact(x) { if (x <= 1) return 1; else return x*fact(x-1); };
// Выражения определения функций могут также использоваться в качестве
// аргументов других выражений:
data.sort(function(a,b) { return a-b: }):
// Выражения определения функций иногда могут тут же вызываться:
var tensquared = (function(x) {return x*x;}(10));
Обратите внимание, что в выражениях определения функций имя функции может отсутствовать. Инструкция объявления функции фактически объявляет переменную и присваивает ей объект функции. Выражение определения функции, напротив, не объявляет переменную. Однако в выражениях определения допускается указывать имя функции, как в функции вычисления факториала выше, которое может потребоваться в теле функции для вызова себя самой. Если выражение определения функции включает имя, данное имя будет ссылаться на объект функции в области видимости этой функции. Фактически имя функции становится локальной переменной, доступной только в теле функции. В большинстве случаев имя функции не требуется указывать в выражениях определения, что делает определения более компактными. Особенно удобно использовать выражения для определения однократно используемых функций, как в последних двух примерах выше.
Как описывалось в разделе 5.3.2, инструкции объявления функций «поднимаются» в начало сценария или вмещающей их функции, благодаря чему объявленные таким способом функции могут вызываться в программном коде выше объявления. Это не относится к функциям, которые определяются в виде выражений: чтобы вызвать функцию, необходимо иметь возможность сослаться на нее, однако нельзя сослаться на функцию, которая определяется с помощью выражения, пока она не будет присвоена переменной. Объявления переменных также поднимаются вверх (раздел 3.10.1), но операции присваивания значений этим переменным не поднимаются, поэтому функции, определяемые в виде выражений, не могут вызываться до того, как они будут определены.
Обратите внимание, что большинство (но не все) функций в примере 8.1 содержат инструкцию return
(раздел 5.6.4). Инструкция return
завершает выполнение функции и выполняет возврат значения своего выражения (если указано) вызывающей программе. Если выражение в инструкции return
отсутствует, она возвращает значение undefined
. Если инструкция return
отсутствует в функции, интерпретатор просто выполнит все инструкции в теле функции и вернет вызывающей программе значение undefined
.
Большинство функций в примере 8.1 вычисляют некоторое значение, и в них инструкция return
используется для возврата этого значения вызывающей программе. Функция printprops()
несколько отличается в этом смысле: ее работа заключается в том, чтобы вывести имена свойств объекта. Ей не нужно возвращать какое-либо значение, поэтому в функции отсутствует инструкция return
. Функция printprops()
всегда будет возвращать значение undefined
. (Функции, не имеющие возвращаемого значения, иногда называются процедурами.)
8.1.1. Вложенные функции
В JavaScript допускается вложение определений функций в другие функции. Например:
function hypotenuse(a, b) {
function square(x) { return x*x; }
return Math.sqrt(square(a) + square(b));
}
Особый интерес во вложенных функциях представляют правила видимости переменных: они могут обращаться к параметрам и переменным, объявленным во вмещающей функции (или функциях). Например, в определении выше внутренняя функция square()
может читать и изменять параметры а и Ь, объявленные во внешней функции hypotenuse().
Эти правила видимости, действующие для вложенных функций, играют важную роль, и мы еще вернемся к ним в разделе 8.6.
Как отмечалось в разделе 5.3.2, инструкции объявления функций в действительности не являются настоящими инструкциями, и спецификация ECMAScript допускает использовать их только в программном коде верхнего уровня. Они могут появляться в глобальном программном коде или внутри других функций, но они не могут находиться внутри циклов, условных инструкций, инструкций try/catch/finally
или with. [11] Некоторые реализации JavaScript могут иметь менее строгие требования. Например, в броузере Firefox допускается наличие «условных определений функций» внутри инструкций if.
Обратите внимание, что эти ограничения распространяются только на объявления функций в виде инструкции function
. Выражения определения функций могут присутствовать в любом месте в программе на языке JavaScript.
8.2. Вызов функций
Программный код, образующий тело функции, выполняется не в момент определения функции, а в момент ее вызова. Функции в языке JavaScript могут вызываться четырьмя способами:
• как функции,
• как методы,
• как конструкторы и
• косвенно, с помощью их методов саll()и аррlу().
8.2.1. Вызов функций
Вызов функций как функций или как методов, выполняется с помощью выражения вызова (раздел 4.5). Выражение вызова состоит из выражения обращения к функции, которое возвращает объект функции, и следующими за ним круглыми скобками со списком из нуля или более выражений-аргументов, разделенных запятыми, внутри. Если выражение обращения к функции является выражением обращения к свойству - если функция является свойством объекта или элементом массива - тогда выражение вызова является выражением вызова метода. Этот случай будет описан ниже. В следующем фрагменте демонстрируется несколько примеров выражений вызова обычных функций:
Читать дальшеИнтервал:
Закладка: