Задать вопрос
  • Что такое анонимная функция и с чем ее едят?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Анонимные функции очень часто используются для выполнения какого-то кода в коллбэках, где в целом не нужно создавать отдельную именную функцию под это действие. Например:

    button.addEventListener('click', function (event) {
        // эта анонимная функция будет вызвана при клике
    }, false);
    
    // или можно так, посложнее, но обычно это лишнее
    function btnClick (event) {
        // это уже функция с именем
    }
    button.addEventListener('click', btnClick, false); // <-  в данном случае мы передали ссылку на функцию


    Замыкания же, это такой прием для хранения скрытых данных, и тут конечно тоже можно использовать анонимные функции, но соль не в этом.
    Ответ написан
    4 комментария
  • Что такое анонимная функция и с чем ее едят?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Анонимная функция (еще можно встретить такое название как лямбды) - функция без имени. Может быть использована в момент объявления, можно присвоить переменной, можно еще всякие штуки делать. Если хочется знать что еще можно с ними делать, добро пожаловать в чудный мир Лямбда-исчислений и функционального программирования.
    Ответ написан
    Комментировать
  • Что такое анонимная функция и с чем ее едят?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    На самом деле классика случая анонимной+замыкание:
    var name="admin"
        
        setTimeout(function(){
            alert(name);
        },1000);


    А анонимная функция без имени, а без имени она потому что ее вызывают не по имени, а по ссылке на нее.
    т.е полный пример с замыканием:

    function sayAfter(text,delay){  
        setTimeout(function(){
            alert(text);
        },delay);
       }
    
      sayAfter("lol",1000);


    Аудитория требует более тонкого примера применения...

    (function(){
            var x, y, z;
    
            //много разного кода, много переменных, которые не нужны в глобальной области видимости
        })();
    Ответ написан
    8 комментариев
  • Что такое замыкание?

    vicodin
    @vicodin
    Имею некоторый опыт
    https://hackernoon.com/how-my-10-year-old-learned-... - вот тут парень писал, как учил 10-летнего сына javascript'у, если ребенок понял, то вы уж точно должны:
    Closures

    This was fun! CodeSchool did a great job in Javascript Road Trip Part 3, but it just didn’t click for my son right away. Closures still trip me up to this day.

    My first explanation attempt:
    “A closure is like a dinosaur fossil — a snapshot from a moment in time preserved for millions of years. You can get still get information about the dinosaur from the fossil, even though the dinosaur itself has been gone for millions of years.”

    Closures were starting to make sense, so I tried using cookies again . . .
    “Let’s say I go to the same bakery every day and ask the baker for a cookie. The first thing he/she asks is, ‘What kind of cookie do you want?’ After a few days, the baker might already know what cookie I like and simply ask, ‘The usual?’. By saving my cookie choice in memory, he/she is able to reuse the same function from the previous day to get me the proper cookie without having to ask again.”

    Eh… It was still a bit fuzzy, until my son asked me…
    “So, it’s like when we go to the barber and he just cuts our hair without asking what we want? He always asks new customers how they want him to cut, but never asks us anymore.”

    Ding, ding, ding! He got it!!!
    Ответ написан
    5 комментариев
  • Что такое замыкание?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    В целом ты все верно понял. Почитал я тут ответы, термины, термины, термины...

    Я люблю простые объяснения, буквально на пальцах.

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

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

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

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

    Один из основных паттернов, для которых применяются замыкания - ограничение доступа к данным, их изоляция (ограничение их области видимости).

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

    В ответах есть пример со счетчиком, который наглядно демонстрирует этот принцип.
    Ответ написан
    2 комментария
  • Что такое замыкание?

    DzodzikovAK
    @DzodzikovAK
    Java Developer
    Замыкание - это функция, содержащая в себе ссылки на переменные из внешней области видимости. Т.е. она "замыкает" внешние переменные в себе.

    Собственно, это один из двух видов анонимных функций: есть лямбда-функции, есть замыкания (clojures). В этом их отличие.

    замыкание js - это функция внутри другой функции ("обертки")

    Нет, замыкание не обязательно является вложенной функцией.
    Ответ написан
    2 комментария
  • Что такое замыкание?

    @HowardRoark
    Full stack developer
    Мне кажется, самый простой пример замыкания - это счетчик.
    var counter = (function () {
    	var current = 0;
    	return function () {
    		current++;
    		return current;
    	}
    })();
    
    console.log(counter()); // 1
    console.log(counter()); // 2

    В данном случае мы не имеем доступ к переменной current и функция гарантированно возвращает каждый раз уникальное значение.
    Если бы это была простая функция, то переменная, содержащая состояние (current), должна была бы находиться вне функции.
    var current = 0;
    var counter = function () {
    	current++;
    	return current;
    }
    
    console.log(counter()); // 1
    current = 5;
    console.log(counter()); // 6

    А это уже нарушает принцип "черного ящика", т.к. переменной можно присвоить другое значение в любом месте.
    Ответ написан
    4 комментария