Функции в JavaScript. Определение и вызов, параметры и аргументы функций. Вложенные функции

Функции - это блоки кода, которые определяется один раз и могут вызываться на выполнение любое количество раз. Функции в JavaScript обладают всеми этими свойствами, а следовательно, их можно рассматривать в данном языке как и любой другой объект

Функции в JavaScript

» » Сообщение:

Функция - это блок кода, который определяется один раз и затем может вызываться на выполнение любое количество раз.

Функции как объекты первого класса

В JavaScript объекты обладают определёнными свойствами:

  • Их можно создавать с помощью литералов
  • Их можно присваивать переменным, элементам массива и свойствам других объектов
  • Их можно передавать в качестве аргументов функциям
  • Их можно возвращать в качестве значений из функций
  • Они могут обладать свойствами, которые допускается создавать и присваивать динамически

Функции в JavaScript обладают всеми этими свойствами, а следовательно, их можно рассматривать в данном языке как и любой другой объект. Именно поэтому функции и называются объектами первого класса. Но помимо того что к функциям следует относится как и к другим типам объектов, они обладают особым свойством: их можно вызывать.

Определение и вызов функции

Функция определяется с помощью ключевого слова function, за которым указываются следующие компоненты:

  • Идентификатор, определяющий имя функции. В качестве имени функции обычно выбирают глагол, т. к. функция выполняет действие.
  • Пара круглых скобок вокруг списка из нуля или более идентификаторов, разделяемых запятыми. Данные идентификаторы называются параметрами функции.
  • Тело функции, состоящее из пары фигурных скобок, внутри которых располагаются инструкции. Тело функции может быть пустым, но фигурные скобки должны быть указаны всегда. Инструкции, расположенные в теле функции, выполняются при каждом вызове функции.

Синтаксис определения функции выглядит следующим образом:

Код: Выделить всё Развернуть
function имя_функции[i](параметры)[/i] { инструкции }

Простой пример определения функции:

Код: Выделить всё Развернуть
function starline() {
  for[i](var i = 0; i < 45; i++)[/i] {
   document.write[i]("*")[/i];
  }
}

Несмотря на то, что приведённая в примере функция короткая и простая, она содержит все перечисленные компоненты.

Программный код, расположенный в теле функции, выполняется не в момент определения функции, а в момент её вызова. Для вызова функции используется оператор вызова, представляющий из себя пару круглых скобок ().
Оператор вызова указывается после имени функции, которая вызывается на выполнение. Он инициирует выполнение самой функции. Это означает, что управление передаётся инструкциям расположенным в теле функции.
После своего выполнения, управление передаётся инструкции, следующей за вызовом функции.
Завершается вызов функции как и все инструкции точкой с запятой (;):

Код: Выделить всё Развернуть
starLine();
document.write("

это абзац
");
starLine();

Рассмотренное нами определение функции, в спецификации языка, называется «Function Declaration» (сокращённо FD).

Параметры и аргументы

Как уже было сказано, определение функции может включать в себя список идентификаторов (параметры функции), которые играют роль локальных переменных в теле функции. При указании параметров функции ключевое слово var использовать не нужно, JavaScript объявляет их в качестве локальных переменные автоматически. Параметров может быть указано любое количество:

Код: Выделить всё Развернуть
function foo[i](a,b,c)[/i] { ... }  // a,b,c - параметры функции

При вызове функции, ей могут передаваться значения, которыми будут инициализированы параметры. Значения, которые передаются при вызове функции называются аргументы.

Код: Выделить всё Развернуть
function foo[i](a,b)[/i] {
  var c = a + b;
  alert[i](c)[/i];
}

foo[i](5, 7)[/i];

Когда при вызове функции ей передаётся список аргументов, эти аргументы присваиваются параметрам функции в том порядке, в каком они указаны: первый аргумент присваивается первому параметру, второй аргумент второму параметру и т.д. Если число аргументов отличается от числа параметров, то никакой ошибки не происходит.
В JavaScript подобная ситуация разрешается следующим образом:

  • Если при вызове функции ей передаётся больше аргументов, чем задано параметров, "лишние" аргументы просто не присваиваются параметрам. Допустим, имеется следующее определение функции:
    Код: Выделить всё Развернуть
    function foo[i](a,b,c)[/i] { ... }

    Если при её вызове указать foo(1,2,3,4,5), то аргументы 1,2 и 3 будут присвоены параметрам a,b и c соответственно. В то же время аргументы 4 и 5 не будут присвоены ни одному из параметров данной функции.

  • Если функция имеет больше параметров, чем передано ей аргументов, то параметрам без соответствующих аргументов присваивается значение undefined. Так, если при вызове функции foo(a,b,c) указать foo(1), параметру a будет присвоено значение 1, а параметрам b и c - значение undefined.
    Код: Выделить всё Развернуть
    function foo(a,b,c) {
      document.write(a+"
    "+b+"
    "+c);
    }

    foo(1);

Все функции имеют два неявных параметра: arguments и this.
Под словом неявный подразумевается, что эти параметры не перечисляются явно в сигнатуре (определении) функции.
Эти параметры также неявно инициализируются при вызове функции. К ним можно обращаться в самой функции таким же образом, как и к любым другим явно установленным параметрам.

Параметр arguments

Параметр arguments является объектом, который содержит все аргументы переданные функции. Он является локальным объектом, который доступен только внутри функции. Если попытаться получить доступ к arguments вне функции, будет вызвана ошибка.

Объект arguments не относится к типу Array.
Он похож на массив, но не имеет никаких его методов и свойств, кроме length. Поскольку он похож на массив, обратиться к переданным функции аргументам можно посредством индексов. Индекс первого элемента 0. Например, если функции было передано 3 аргумента, на каждый аргумент можно сослаться следующим образом:

Код: Выделить всё Развернуть
function foo [i](a, b, c)[/i] {
  document.write[i](arguments[0])[/i];
  document.write[i](arguments[1])[/i];
  document.write[i](arguments[2])[/i];
}

foo[i](1, 2, 3)[/i];

Параметр this

Этот параметр ссылается на объект, который неявно связан с вызываемой функцией и называется контекстом вызова функции.
То, на что указывает параметр this, определяется не тем, как функция объявляется, а тем, как она вызывается.

Инструкция return

Функция может возвратить некоторое значение (результат работы функции) программе, которая её вызвала.
Возвращаемое значение передаётся в точку вызова функции.

Инструкция return внутри функции служит для определения значения, возвращаемого функцией. В качестве возвращаемого значения может быть значение любого типа. Если в качестве возвращаемого значения используется выражение, в программу возвращается не само выражение, а результат его вычисления.
Инструкция return имеет следующий синтаксис:

Код: Выделить всё Развернуть
return выражение;

Для дальнейшего использования возвращаемого значения, результат выполнения функции можно присвоить например переменной:

Код: Выделить всё Развернуть
function calc[i](a)[/i] {
  return a * a;
}

var x = calc[i](5)[/i];

document.write[i](x)[/i];

Инструкция return может быть расположена в любом месте функции.
Обратите внимание, при выполнении кода внутри функции, как только будет достигнута инструкция return, функция возвращает значение и немедленно завершает своё выполнение.
Код, расположенный в теле функции после инструкции return, будет проигнорирован.

Код: Выделить всё Развернуть
var a = 1;

function foo() {
  ++a;
  return;
  ++a;
}

foo();

document.write[i](a)[/i];  // => 2

Внутри функции может быть использовано несколько инструкций return, например если возвращаемое значение зависит от некоторых условий выполнения:

Код: Выделить всё Развернуть
function check[i](a, b)[/i] {
  if[i](a > b)[/i] return a;
  else return b;
}

document.write[i](check(3, 5)[/i]);

Если инструкция return не указана или не указано возвращаемое значение, то функция вернёт значение undefined.

Код: Выделить всё Развернуть
// Инструкция return не указана
function bar[i]() { document.write("функция bar выполнилась")[/i]; }

// Возвращаемое значение не указано
function foo[i](a)[/i] {
  if[i](!a)[/i] return;
  document.write[i](a)[/i];
}

var a = bar(); // undefined
var b = foo(); // undefined

document.write[i]("a: " + a + "<br> b: " + b)[/i];

Выбор имени функции

Имя функции следует выбирать по тем же правилам что и имена для всех остальных идентификаторов.
Единственное различие - это то, что в качестве имени функции обычно выбирают глагол, т.к. функция выполняет действие.

Вложенные функции

В JavaScript функции могут быть определены внутри других функций. Такие функции называются вложенными:

Код: Выделить всё Развернуть
function foo[i](a)[/i] {
  function bar() { return a * a }  // Определение вложенной функции

  return bar();  // Вернуть значение, возвращаемое вложенной функцией
}

document.write[i](foo(5)[/i]);

Внутри вложенной функции можно обращаться к параметрам и локальным переменным вмещающей функции (внешней):

Код: Выделить всё Развернуть
function foo[i](a)[/i] {
  var x = 0;

  function bar() {
    x = 10;       
    return a * x   // Используем локальную переменную и параметр внешней функции
  }

  return bar();    // Вернуть значение, возвращаемое вложенной функцией
}

document.write[i](foo(5)[/i]);

Подъём определения функции

Определение функции неявно «поднимается» в начало сценария или вмещающей её (внешней) функции, благодаря чему функцию можно вызвать ещё до того, как она будет определена.

Код: Выделить всё Развернуть
foo();
bar();

function foo() {
  alert[i]("Hello!")[/i];
}

function bar() {
  var str = "Hello again!";
  foo();

  function foo() {
    document.write[i](str)[/i];
  }
}

Таким образом функции выше эквивалентны определениям функций приведённым ниже, в которых определения «подняты» в начало.

Код: Выделить всё Развернуть
function foo() {
  alert[i]("Hello!")[/i];
}

function bar() {
  function foo() {
    document.write[i](str)[/i];
  }

  var str = "Hello again!";
  foo();
}

foo();
bar();
Вложения
Зарегистрируйтесь, чтобы скачать вложения.
функции в javascript, определение функций, вызов функций, аргументы функций, function, javascript, arguments, this, array, undefined



Похожие темыКомментарии ПросмотрыПоследнее сообщение
0648JavaScript. Логические операторы и ...
Сообщение от: Admin
3900BBComplex - Классы для каскадных та...
Сообщение от: Admin
0929Обход child nodes - потомков элемен...
Сообщение от: Admin
02350Дженнифер Нидерст Роббинс. HTML5, C...
Сообщение от: Admin
0634Колонки одинаковой высоты - лучшее ...
Сообщение от: Admin