Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

// Вычисляет Декартово расстояние между точками (х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.

  • Читать дальше
  • 1
  • ...
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: