Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Функции в JavaScript

Лекция



Привет, сегодня поговорим про функции в javascript, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое функции в javascript , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend).


  1. Объявление
  2. Локальные переменные
  3. Внешние переменные
  4. Параметры
  5. Аргументы по умолчанию
  6. Стиль объявления функций
  7. Возврат значения
  8. Выбор имени
  9. Итого

Зачастую нам надо повторять одно и то же действие во многих частях программы.

Например, красиво вывести сообщение необходимо при приветствии посетителя, при выходе посетителя с сайта, еще где-нибудь.

Чтобы не повторять один и тот же код во многих местах, придуманы функции. Функции являются основными «строительными блоками» программы.

Примеры встроенных функций вы уже видели — это alert(message)prompt(message, default) иconfirm(question). Но можно создавать и свои.

Объявление

Пример объявления функции:

 

function showMessage() { 
  alert('Привет всем присутствующим!');
}

 

Вначале идет ключевое слово function, после него имя функции, затем список параметров в скобках (в примере выше он пустой) и тело функции — код, который выполняется при ее вызове.

Объявленная функция доступна по имени, например:

 

   
1 function showMessage() { 
2   alert('Привет всем присутствующим!');
3 }
4  
5 showMessage();
6 showMessage();

 

Этот код выведет сообщение два раза. Уже здесь видна главная цель создания функций: избавление от дублирования кода.

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

Локальные переменные

Функция может содержать локальные переменные, объявленные через var. Такие переменные видны только внутри функции:

 

   
1 function showMessage() {
2   var message = 'Привет, я - Вася!'// локальная переменная
3  
4   alert(message);
5 }
6  
7 showMessage(); // 'Привет, я - Вася!'
8  
9 alert(message); // <-- будет ошибка, т.к. переменная видна только внутри

 

Блоки if/elseswitchforwhiledo..while не влияют на область видимости переменных.

При объявлении переменной в таких блоках, она все равно будет видна во всей функции.

Например:

1 function count() {
2   for (var i=0; i<3; i++) {
3     var j = i * 2;
4   }
5  
6   alert(i); // i=3, на этом значении цикл остановился
7   alert(j); // j=4, последнее значение, на котором цикл сработал, было i=2
8 }

 

Неважно, где именно в функции и сколько раз объявляется переменная. Любое объявление срабатывает один раз и распространяется на всю функцию.

Объявления переменных в примере выше можно передвинуть вверх, это ни на что не повлияет:

1 function count() {
2   var i, j; // передвинули объявления var в начало
3   for (i=0; i<3; i++) {
4     j = i * 2;
5   }
6  
7   alert(i); // i=3
8   alert(j); // j=4
9 }

 

Внешние переменные

Функция может обратиться ко внешней переменной, например:

 

   
1 var userName = 'Вася';
2  
3 function showMessage() {
4   var message = 'Привет, я ' userName;
5   alert(message);
6 }
7  
8 showMessage(); // Привет, я Вася

 

Доступ возможен не только на чтение, но и на запись. При этом, так как переменная внешняя, то изменения будут видны и снаружи функции:

 

   
01 var userName = 'Вася';
02  
03 function showMessage() {
04   userName = 'Петя'// (1) присвоение во внешнюю переменную
05   var message = 'Привет, я ' userName;
06   alert(message);
07 }
08  
09 showMessage();
10  
11 alert(userName); // Петя, значение внешней переменной изменено функцией

 

Конечно, если бы внутри функции, в строке (1), была бы объявлена своя локальная переменнаяvar userName, то все обращения использовали бы ее, и внешняя переменная осталась бы неизменной.

 

Переменные, объявленные на уровне всего скрипта, называют «глобальными переменными».

Делайте глобальными только те переменные, которые действительно имеют общее значение для вашего проекта.

Пусть каждая функция работает «в своей песочнице».

 

 

Внимание: неявное объявление глобальных переменных!

В старом стандарте JavaScript существовала возможность неявного объявления переменных присвоением значения.

Например:

   
1 function showMessage() {
2   message = 'Привет'// без var!
3 }
4  
5 showMessage();
6  
7 alert(message); // Привет

 

В коде выше переменная message нигде не объявлена, а сразу присваивается. Об этом говорит сайт https://intellect.icu . Скорее всего, программист просто забыл поставить var.

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

Избегайте этого.

Здесь опасность даже не в автоматическом создании переменной, а в том, что глобальные переменные должны использоваться тогда, когда действительно нужны «общескриптовые» параметры.

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

 

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

Параметры

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

Например, этот код выводит два сообщения:

 

   
1 function showMessage(from, text) { // параметры from, text
2    
3   from = "** " + from + " **"// здесь может быть сложный код оформления
4   alert(from + '\n\n' + text);
5 }
6  
7 showMessage('Маша''Привет!');
8 showMessage('Маша''Как дела?');

 

Параметры копируются в локальные переменные функции.

В примере ниже изменение from в строке (1) не отразится на значении внешней переменной from (2), т.к. изменена была копия значения:

 

   
1 function showMessage(from, text) {
2   from = '**' + from + '**';  // (1), красиво оформили from
3   alert(from + '\n\n' + text);
4 }
5  
6 var from = 'Маша', msg = 'Привет!'// (2)
7  
8 showMessage(from, msg); // значения будут скопированы в параметры
9 alert(from); // перезапись в строке (1) не повлияет на внешнюю переменную

 

Аргументы по умолчанию

Функцию можно вызвать с любым количеством аргументов.

Например, функцию показа сообщения showMessage(from, text) можно вызвать с одним аргументом:

showMessage("Маша");

 

Если параметр не передан при вызове — он считается равным undefined.

Такую ситуацию можно отловить и назначить значение «по умолчанию»:

 

   
01 function showMessage(from, text) {
02   if (text === undefined) {
03     text = 'текст не передан';
04   }
05  
06   alert(from + ": " + text);
07 }
08  
09 showMessage("Маша""Привет!"); // Маша: Привет!
10 showMessage("Маша"); // Маша: текст не передан

 

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

Для указания значения «по умолчанию», то есть, такого, которое используется, если аргумент не указан, используется два способа:

  1. Можно проверить, равен ли аргумент undefined, и если да — то записать в него значение по умолчанию. Этот способ продемонстрирован в примере выше.
  2. Использовать оператор ||:

     

       
    1 function showMessage(from, text) {
    2   text = text || 'текст не передан';
    3  
    4   ...
    5 }

     

    Второй способ считает, что аргумент отсутствует, если передана пустая строка, 0, или вообще любое значение, которое в булевом виде является false.

Если аргументов передано больше, чем надо, например showMessage("Маша", "привет", 1, 2, 3), то ошибки не будет. Но так как для «лишних» аргументов не предусмотрены параметры, то доступ к ним можно будет получить только через специальный объект arguments, который мы рассмотрим в главе Псевдо-массив arguments.

Стиль объявления функций

В объявлении функции есть правила для расстановки пробелов. Они отмечены стрелочками:

Функции  в JavaScript

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

Возврат значения

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

Например, создадим функцию calcD, которая будет возвращать дискриминант квадратного уравнения по формуле b2 - 4ac:

 

   
1 function calcD(a, b, c) {
2    return b*b - 4*a*c;
3 }
4  
5 var test = calcD(-4, 2, 1);
6 alert(test); // 20

 

Для возврата значения используется директива return.

Она может находиться в любом месте функции. Как только до нее доходит управление — функция завершается и значение передается обратно.

Вызовов return может быть и несколько, например:

 

   
01 function checkAge(age) {
02   if (age > 18) {
03     return true;
04   else {
05     return confirm('Родители разрешили?');
06   }
07 }
08  
09 var age = prompt('Ваш возраст?');
10  
11 if (checkAge(age)) {
12   alert('Доступ разрешен');
13 else {
14   alert('В доступе отказано');
15 }

 

 

Важность: 4

Следующая функция возвращает true, если параметр age больше 18.
В ином случае она задает вопрос посредством вызова confirm и возвращает его результат.

 

1 function checkAge(age) {
2   if (age > 18) {
3     return true;
4   else {
5     // ...
6     return confirm('Родители разрешили?');
7   }
8 }

 

Будет ли эта функция работать как-то иначе, если убрать else?

 

1 function checkAge(age) {
2   if (age > 18) {
3     return true;
4   }
5   // ...
6   return confirm('Родители разрешили?');
7 }

 

Есть ли хоть одно отличие в поведении этого варианта?

Решение

Оба варианта функции работают одинаково, отличий нет.

[Открыть задачу в новом окне]

Важность: 4

Следующая функция возвращает true, если параметр age больше 18.
В ином случае она задает вопрос confirm и возвращает его результат.

 

1 function checkAge(age) {
2   if (age > 18) {
3     return true;
4   else {
5     return confirm('Родители разрешили?');
6   }
7 }

 

Перепишите функцию, чтобы она делала то же самое, но без if, в одну строку.
Сделайте два варианта функции checkAge:

  1. Используя оператор '?'
  2. Используя оператор ||
Решение

Используя оператор '?':

 

function checkAge(age) {
  return (age > 18) ? true : confirm('Родители разрешили?');
}

 

Используя оператор || (самый короткий вариант):

 

function checkAge(age) {
  return (age > 18) || confirm('Родители разрешили?');
}

 

[Открыть задачу в новом окне]

 

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

Например:

 

1 function showMovie(age) {
2   if (!checkAge(age)) {
3     return;
4   }
5    
6   alert("Фильм не для всех"); // (*) 
7   // ...
8 }

 

В коде выше, если сработал if, то строка (*) и весь код под ней никогда не выполнится, так как return завершает выполнение функции.

 

Значение функции без return и с пустым return

В случае, когда функция не вернула значение или return был без аргументов, считается что она вернула undefined:

 

   
1 function doNothing() { /* пусто */ }
2  
3 alert( doNothing() ); // undefined

 

Обратите внимание, никакой ошибки нет. Просто возвращается undefined.

Еще пример, на этот раз с return без аргумента:

 

   
1 function doNothing() {
2   return;
3 }
4  
5 alert( doNothing() === undefined ); // true

 

 

Выбор имени

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

Как правило, используются глагольные префиксы, обозначающие общий характер действия, после которых следует уточнение.

Функции, которые начинаются с "show" — что-то показывают:

showMessage(..)     // префикс show, "показать" сообщение

 

Функции, начинающиеся с "get" — получают, и т.п.:

 

1 getAge(..)          // get, "получает" возраст
2 calcD(..)           // calc, "вычисляет" дискриминант
3 createForm(..)      // create, "создает" форму
4 checkPermission(..) // check, "проверяет" разрешение, возвращает true/false

 

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

 

Одна функция — одно действие

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

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

…Но самое главное — в функции не должно быть ничего, кроме самого действия и поддействий, неразрывно связанных с ним.

Например, функция проверки данных (скажем, "validate") не должна показывать сообщение об ошибке. Ее действие — проверить.

 

 

Сверхкороткие имена функций

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

Например, во фреймворке jQuery есть функция $, во фреймворке Prototype — функция $$, а в библиотеке Underscore очень активно используется функция с названием из одного символа подчеркивания _.

 

Итого

Объявление функции:

function имя(параметры, через, запятую) {
  код функции
}

 

  • Передаваемые значения копируются в параметры функции и становятся локальными переменными.
  • Параметры функции являются ее локальными переменными.
  • Можно объявить новые локальные переменые при помощи var.
  • Значение возвращается оператором return ....
  • Вызов return тут же прекращает функцию.
  • Если return; вызван без значения, или функция завершилась без return, то ее результат равенundefined.

При обращении к необъявленной переменной функция будет искать внешнюю переменную с таким именем.

По возможности, рекомендуется использовать локальные переменные и параметры:

  • Это делает очевидным общий поток выполнения — что передается в функцию и какой получаем результат.
  • Это предотвращает возможные конфликты доступа, когда две функции, возможно написанные в разное время или разными людьми, неожиданно используют одну и ту же внешнюю переменную.

Именование функций:

  • Имя функции должно понятно и четко отражать, что она делает. Увидев ее вызов в коде, вы должны тут же понимать, что она делает.
  • Функция — это действие, поэтому для имен функций, как правило, используются глаголы.

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

 

Важность: 1

Задача «Hello World» для функций  

Напишите функцию min(a,b), которая возвращает меньшее из чисел a,b.

Пример вызовов:

min(2, 5) == 2
min(3, -1) == -1
min(1, 1) == 1

 

Решение
[Открыть задачу в новом окне]

Важность: 4

Напишите функцию pow(x,n), которая возвращает x в степени n. Иначе говоря, умножает x на себя n раз и возвращает результат.

 

pow(3, 2) = 3*3 = 9
pow(3, 3) = 3*3*3 = 27
pow(1, 100) = 1*1*...*1 = 1

 

Создайте страницу, которая запрашивает x и n, а затем выводит результат pow(x,n).

Демо: tutorial/intro/pow.html

P.S. В этой задаче функция обязана поддерживать только натуральные значения n, т.е. целые от 1 и выше.

Решение

Решение: tutorial/intro/pow.html

К сожалению, в одной статье не просто дать все знания про функции в javascript. Но я - старался. Если ты проявишь интерес к раскрытию подробностей,я обязательно напишу продолжение! Надеюсь, что теперь ты понял что такое функции в javascript и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)

создано: 2014-10-07
обновлено: 2021-03-13
132655



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)

Термины: Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)