Функции

Что такое функции?

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

Почему надо использовать функции?

  • Более управляемое программирование
    • Разделение больших проблем по маленьким кусочкам
    • Улучшение организации структуры программы
    • Улучшение читабельности и восприятия кода
    • введение абстрактности
  • Повторное использование кода
    • Удобство рефакторинга кода

Объявление и создание функций

  • функции могут именоваться
    • Используется для вызова функций
    • Описывает назначение функции
  • В Функциях JavaScript не надо указывать возвращаемый тип данных
    • Каждая функция всегда возвращает значение

In [3]:
function printLogo() {
    console.log("Основы JavaScript");
    console.log("Курсы Веб-программирования");
}

printLogo()


Основы JavaScript
Курсы Веб-программирования
Out[3]:
undefined

Способы определения функций

  • Используя конструктор для обьекта функции

    var print = new Function("console.log('Hello')");
    
  • С помошью обьявления функции

    function print() { console.log("Hello") };
    
  • С помошью выражения функции

    var print = function() { console.log("Hello") };
    var print = function printFunc() { console.log("Hello") };
    

Вызов функций

  • Чтобы вызвать функцию достаточно использовать:
    • Имя функции
    • Круглые скобки
    • Точку с запятой (;)
      • Опционально но не обязательно
  • Эти действия вызовут код функци на исполнение:

  • Функция может вызывать:

    • Другую функцию
    • Саму себя (известна как рекурсивная функция)

In [4]:
function printLogo() {
    console.log('---------------');
    console.log('Веб программирование');
    console.log('ННГУ им.Лобачевского');
    console.log('---------------');
}

function anotherPrint() {
    printLogo();
    // попробуйте anotherPrint();
}

anotherPrint();


---------------
Веб программирование
ННГУ им.Лобачевского
---------------
Out[4]:
undefined

Параметры функции

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

Установлене и использовние параметров функции

  • Поведение функции зависит от переданных параметров
  • Параметры могут быть любым типом
    • Number, String, Object, Array, и.т.д.
    • Даже быть Function (другой функцией)

In [6]:
function printSign(number) {
    if (number > 0) {
        console.log("Положительное");
    } else if (number < 0) {
        console.log("Отрицательное");
    } else {
        console.log("Ноль");
    }
}

printSign(3)
printSign(-3)
printSign(0)


Положительное
Отрицательное
Ноль
Out[6]:
undefined
  • Функции могут иметь столько параметров, сколько необходимо:

In [12]:
function printMax(x, y) {
  var max;
  x = +x; y = +y;
  max = x;

  if (y > max) {
    max = y;
  }
  console.log(`Maximal number: ${max}`);
}

printMax(2, 4)


Maximal number: 4
Out[12]:
undefined

Вызов функций с параметрами

  • Для вызоа функций и передачи параметров в качестве аргументов:
    • Используется имя функции и указание параметров перечисленных через запятую внутри круглых скобок
  • Вывести знак числа на экран

In [13]:
function printSign(number) {
  number = +number;

  if (number > 0) {
    console.log(`Число ${number} положительное.`);
  } else if (number < 0) {
    console.log(`Число ${number} отрицательное.`);
  } else {
    console.log(`Число ${number} ноль.`);
  }
}

printSign(-5);
//printSign(balance);
printSign(2 + 3);
printMax(100, 200);
//printMax(oldQuantity * 1.5, quantity * 2);


Число -5 отрицательное.
Число 5 положительное.
Maximal number: 200
Out[13]:
undefined
  • создание функции, которая выводит треугольник из цифр:

    n = 6                  n = 5
    
    1
    1 2                    1
    1 2 3                  1 2
    1 2 3 4                1 2 3
    1 2 3 4 5              1 2 3 4
    1 2 3 4 5 6            1 2 3 4 5
    1 2 3 4 5              1 2 3 4
    1 2 3 4                1 2 3
    1 2 3                  1 2
    1 2                    1
    1
    

In [16]:
function pringTriangle(n) {
  var line;
  n = +n;

  for (line = 1; line <= n; line += 1) {
    printLine(1, line);
  }

  for (line = n-1; line >= 1; line -= 1) {
    printLine(1, line);
  }
}

function printLine(start, end) {
  var line = "",
      i;
  start = +start; end = +end;
  for (i = start; i <= end; i += 1){
    line += " " + i;
  }
  console.log(line);
}

pringTriangle(10)


 1
 1 2
 1 2 3
 1 2 3 4
 1 2 3 4 5
 1 2 3 4 5 6
 1 2 3 4 5 6 7
 1 2 3 4 5 6 7 8
 1 2 3 4 5 6 7 8 9
 1 2 3 4 5 6 7 8 9 10
 1 2 3 4 5 6 7 8 9
 1 2 3 4 5 6 7 8
 1 2 3 4 5 6 7
 1 2 3 4 5 6
 1 2 3 4 5
 1 2 3 4
 1 2 3
 1 2
 1
Out[16]:
undefined

Объект arguments

  • Каждая функция JavaScript имеет встроенный параметр arguments
    • он хранит информацию о параметрах передаваемых в функцию
    • Нет необходимости явного объявления
      • Содержится в любой функции

In [17]:
function printArguments() {
  var i;
  for(i in arguments) {
    console.log(arguments[i]);
  }
}
printArguments(1, 2, 3, 4);


1
2
3
4
Out[17]:
undefined
  • обьект arguments не является массивом
    • Он имеет похожую с массивами функциональность
  • Если его надо перебрать, лучше его передать в массив:

In [62]:
function printArguments() {
  var i,
      args;

  args = [].slice.apply(arguments);
  for(i in args) {
    console.log(args[i]);
  }
}

printArguments(1, 2, 3, 4); //1, 2, 3, 4
printArguments([1, 2, 3, 4, 5], 'Stirng', new Object(), new Date());


1
2
3
4
[ 1, 2, 3, 4, 5 ]
Stirng
{}
2017-02-21T15:21:10.810Z
Out[62]:
undefined

Возврат значений из функции

  • Каждая фыункция в JavaScript возвращает значения

    • Возвращает undefined если не указывается возвращаемое значение
    • Может быть любым типом

      • Number, String, Object, Function

        var head = arr.shift();
        var price = getPrice() * quantity * 1.20;
        var noValue = arr.sort();
        
  • Функции могут возвращать любой тип данных:

    • Number, String, Object, и.т.д.
  • Используйте return ключевое слово для возвращения результата

In [24]:
function multiply(firstNum, secondNum) {
    return firstNum * secondNum;
}

function sum(numbers) {
  var sum = 0, number;
  for(number of numbers){
    sum += number;
  }
  return sum;
}

console.log(multiply(2,6))
console.log(sum([2,4,5,7,8]))


12
26
Out[24]:
undefined

return утверждение

  • return утверждение:
    • Немиедлено прерывает выполнение функции
    • Возвращает указанное значение
  • Для того, чтобы прервать выполнениеи функции просто вызовете:
return;
  • Return может быть указано сколько угодно раз внутри функции

    • Для того, чтобы вернуть определенное значение в определенной ветке функции
  • Проверка числа на простоту:


In [27]:
function isPrime(number){
  var divider,
      maxDivider;

  number = +number;
  maxDivider = Math.sqrt(number);

  for(divider = 2; divider <= maxDivider; divider += 1){
    if(number % divider === 0) {
      return false;
    }
  }
  return true;
}

isPrime(4)


Out[27]:
false
  • Вычислить сумму всехсодержащихся в массиве четных чисел

In [28]:
function sum(numbers) {
  var number,
    sum = 0;

  for (number of numbers) {
    if (0 === number % 2) {
      sum += number;
    }
  }
  return sum;
}

sum([2,5,3,7,3,7,3])


Out[28]:
2

Области видимости функций

  • Каждая переменная может использоваться в определенной для нее области видимости
    • Облать определяет то, где переменная может использоваться
    • Обычно применяется локальная и глобальная область видимости

In [61]:
var arr = [1, 2, 3, 3, 4, 3, 5, 3, 6, 7];

function countOccurences(value) {
    var i, 
        count = 0;

    for (i = 0; i < arr.length; i++) {
        if (arr[i] === value) count++;
    }

    return count;
}

countOccurences(3)


Out[61]:
4
  • arr определена в глобальной области видимости (это значит может использоваться везде)
  • count обьявлена внутри countOccurences и может использоваться только внутри нее
  • Попробуйте убратьvar перед count

Перегрузка функций

  • JavaScript не поддерживает перегрузку функций
    • т.е функции с одинаковым именем перекрывают друг друга

In [63]:
function print(number) {
  console.log(`Number: ${number}`);
}

function print(number, text) {
  console.log(`Number: ${number}\nText: ${text}`);
}

print(2);


Number: 2
Text: undefined
Out[63]:
undefined

Перегрузка функций в JavaScript

  • Перегрузку функций в JavaScript можно подделать

    • т.е сделать похожей на перегрузку
      • Существует несколько способов как это сделать
  • Разное число параметров:


In [64]:
function printText (number, text) {
  switch (arguments.length) {
    case 1 : console.log (`Number: ${number}`);
      break;
    case 2 :
      console.log (`Number: ${number}`);
      console.log (`Text: ${text}`);
      break;
  }
}

printText (5); //logs 5
printText (5, "Lorem Ipsum"); //logs 5 and Lorem Ipsum


Number: 5
Number: 5
Text: Lorem Ipsum
Out[64]:
undefined
  • Разные типы параметров:

In [65]:
function printValue (value) {
  switch (typeof value) {
    case "number" : console.log (`Number: ${value}`); break;
    case "string" : console.log (`String: ${value}`); break;
    case "object" : console.log (`Object: ${value}`); break;
    case "boolean" : console.log (`Number: ${value}`); break;
  }
}

printValue (5);
printValue ("Lorem Ipsum");
printValue ([1, 2, 3, 4]);
printValue (true);


Number: 5
String: Lorem Ipsum
Object: 1,2,3,4
Number: true
Out[65]:
undefined

Перегрузка с помощью параметров по умолчанию

  • в JavaScript все параметры опциональны
    • функция может быть вызвана без их указания
  • Параметры по умолчанию проверяются в теле функции
    • Если параметр не указан, присвоить ему значение

In [70]:
var arr = [1, 2, 3, 4, 5, 6, 7, 8];

function contains(arr, value, start, end) {
    var i;

    start = start || 0;
    end = end || arr.length;
    for (i = start; i < end; i++) {
        if (arr[i] === value) {
            return true;
        }
    }

    return false;
}

console.log(contains(arr, 3));
console.log(contains(arr, 3, 3));
console.log(contains(arr, 3, 0, 1));


true
false
false
Out[70]:
undefined

In [ ]: