Лабораторные - Способы вызова функции


Существует 4 способа вызова функции и еще один способ, так называемая самовызывающаяся функция. Итого 5 вариантов применимых в JavaScript. 
Перечислим их:
1. Вызов функции, как функции.

2. Вызов, как метода.

3. Как конструктор

4. Косвенный вызов.

Теперь обо всем подробнее и по порядку. 

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


function('Leto'); //Skoro Leto


2. В случае с вызовом функции, как метода возвращаемые значения обрабатываются точно также, как и при вызове обычной функции. Однако есть одно важное отличие. Любая функция, используемая как метод, фактически получает неявный аргумент – объект, относительно которого она была вызвана. Тело функции получает возможность ссылаться на объект с помощью ключевого слова this.
Пример:


var summa = {
  operand1:1,
  operand2:2,
  add: function(){
    this.result = this.operand1+this.operand2;
  }
}
  calculator.add();
  calculator.result; // вернет 3

3. Далее идут конструкторы. Если вызову функции предшевствует ключевое слово new, то это вызов конструктора.


var n = new function();


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


function Time(hours, minutes){
  this.hours = hour;
  this.minutes = minute;
}

Вызов Time с помощью оператора new создает из функции Time конструктор:


var t = new Time('06', '25');

t.minutes // 25


Главная задача функции-конструктора заключается в иницилизации объекта.

4. Методы call() и apply() позволяют выполнить косвенный вызов функции, как если бы она была методом другого объекта. Первым параметром обоим методам передается объект, относительно которого вызывается функция, этот аргумент определяет ключевое слово this в теле функции.
Метод call() может применяться для вызова функции в контексте нужного объекта:


var Animal1 = {name: 'Cat'}
var Animal2 = {name: 'Dog'}

function sayName() {
    // this — ссылка на объект, в контексте которого вызвана функция
    alert(this.name);
}

sayName.call(Animal1) // выдаст сообщение "Cat"
sayName.call(Animal2) // выдаст сообщение "Dog"

Метод apply() действует точно также, как метод call(), за исключением того, что apply() аргументы для функции передает ввиде элементов массива.

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

Кроме массива аргументов, метод apply получает первый аргрумент, указывающий на вариант связывания this для вызываемой функции. Если функция не ссылается на this, ей можно передать null.


var obj = {}
var scor = [0,1,2]
average.apply(obj, score);
// это будет равносильно вызову: {obj.average(scor[0],scor[1],scor[2])

Т.е. функция average превратилась в метод объекта obj.

5. И наконец самовызывающаяся функция. 

Главной идеей является то, что анонимная функция вызывается сразу после своего объявления. Преимущество от использования самовызывающихся функций вы получите, если нужно выполнить код один раз и сохранить его резульататы во "внешней среде" (без объявления глобальных переменных).

Например, для небольшой веб-страницы можно написать обработчики событий для элементов на странице. Самовызывающиеся функции подходящее средство для такой ситуации.
Синтаксис:


(function () {
    // код функции 
 }());