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

Оцените материал
(0 голосов)

Здравствуйте! Продолжаем изучать функции в JavaScript. И в этом уроке мы с вами рассмотрим такое понятие как замыкание функции и так называемые IIFE функции или самовызывающиеся функции. Итак давайте начинать.

Замыкание функций в JavaScript

 

Замыкания функции

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

function multi(n){
    var y = n;
    return function(m){ return y * m;};
}
var func1 = multi(5);
var res1 = func1(6); // 30
console.log(res1); // 30
 
var func2= multi(4);
var res2 = func2(6); // 24
console.log(res2); // 24

В примере вызов функции multi приводит к вызову внутренней функции. Эта функция  function(m) { return y * m; }  запоминает окружение в котором она была вызвана, в частности значение переменной y. 

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

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

Можно оптимизировать наш пример без создания второй переменной.

function multi(n){
    var y = n;
    return function(m){ return y * m;};
}
var res = multiply(5)(6); // 30
console.log(res);

Как видно из примера параметры можно передавать в двух круглых скобках.

Самовызывающиеся функции или IIFE функции

Самовызывающиеся функции -  это функции, которые способны вызывать сами себя. Их  также  называют Immediately Invoked Function Expression (IIFE). Давайте рассмотрим на примере.

(function(){
    alert("Hello IIFE Function");
}());
 
(function (m){
     
    var res = 1;
    for(var i=1; i<=n; i++)
        res *=i;
    console.log("Факториал числа " + m + " равен " + res);
}(6));

Такие функции как правило не надо вызывать они вызывают сами себя. Обычно это надо для инкапсуляции переменных и методов. Более подробно разберем на объектно-ориентированном программировании в JavaScript.

Итоги.

Замыкание - это функция вместе со всеми локальными переменными, которые ей доступны.

Самовызывающиеся функции - это функции, которые могут сразу же вызывать сами себя.

Задания

Что будет в результате работы функции

var val = 0;
function func() {
  if (1) {
    val = true;
  } else {
    var val = false;
  }

  alert( val );
}
func();

Какой результат выполнения данного кода и почему?

function t() {
  alert( win );
  var win = 5;
  alert( win );
}
t();

Перекрытие внешней переменной

Если у вас во внктренней функции есть своя переменная count. Можно ли в ней получить count из внешней функции.

function makeCounter() {
  var count = 1;
  return function() {
    var count;
    // можно ли здесь вывести count из внешней функции (равный 1)?
  };
}

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

Прочитано 198 раз Последнее изменение Воскресенье, 17 сентября 2017 14:50
Другие материалы в этой категории:
Понравилась запись? Подпишитесь на обновления по почте:

Нетология

TemplateMonster

geekbrains.ru/

Поиск по сайту

Google+