• Простым языком о замыканиях?

    Stalker_RED
    @Stalker_RED
    Ответ написан
    Комментировать
  • Простым языком о замыканиях?

    DanielDemidko
    @DanielDemidko
    Программист
    Всё просто. Замыкание это когда мы возвращаем из одной функции, назовём её глобальной, другую функцию, вложенную в первую.
    Вложенная функция может в своей работе использовать внутренние переменные глобальной функции.
    Замыкания есть не только в JS.
    Ответ написан
    Комментировать
  • Простым языком о замыканиях?

    @programrails
    Моё личное ИМХО:
    1. Для того, чтобы выносить мозг нормальным людям при собеседованиях. Это их основная и главная область применения.
    А ещё для динамического хранения данных. Смысловой аналог функции malloc в языке СИ, только более извращённо-вывернутый - "недовернувшаяся функция" (т.е. зависшая в памяти по сути). Человек, подвешенный за кишки. Отличие от malloc в том, что malloc просто выделяет кусок памяти под данные - а тут кусок памяти выделен под "данные + их некий обработчик" в одном флаконе.
    2. Если говорить о веб-разработке - то на фронтэнде. Если не могут или не хотят хранить данные по-человечески - в куках, локальном хранилище, БД.

    Насколько мне известно, бэкэндеру это вообще не нужно - только фронтэндеру. Ведь на бэкэнде всегда есть БД - и эти извраты ни к чему.
    Ответ написан
    6 комментариев
  • Простым языком о замыканиях?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    1. Для чего замыкание существуют?
    Для инкапсуляции данных.
    В ООП есть модификаторы доступа (private, protected), которые закрывают доступ к данным извне класса, но позволяют обращаться к ним из методов.
    В ФП для этой задачи используют замыкания, закрывая данные внутри функции. Из вне данные недоступны, но вложенные функции имеют к ним доступ.

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

    Хоть и просили без примеров, но на примере показать проще:
    // makeCounter - внешняя функция
    function makeCounter(initialValue) {
      var value = +initialValue || 0;
      // counter - внутренняя функция
      // она использует переменную value из внешней функции
      // что-бы это было возможным, для counter создается замыкание,
      // в котором хранится переменная value
      // переменная initialValue функции counter не нужна, поэтому ее можно "забыть"
      return function counter() {
        return value++;
      };
    }
    
    // у нас 3 экземпляра функции counter
    var counter1 = makeCounter();
    var counter2 = makeCounter();
    var counter3 = makeCounter(100);
    // и для каждой есть своя переменная value
    console.log(counter1()); // 0
    console.log(counter1()); // 1
    console.log(counter2()); // 0
    console.log(counter1()); // 2
    console.log(counter3()); // 100
    
    // а вот получить как-то напрямую переменную value мы не можем
    // инкапсуляция нам не дает поломать данные
    Ответ написан
    Комментировать
  • Простым языком о замыканиях?

    @undefined_title
    Это когда ты при объявлении функции имеешь доступ к переменным окружающей функции, именно и для этого доступа к переменным замыкание и используется
    Ответ написан
    Комментировать
  • Простым языком о замыканиях?

    1. У вас есть алгоритм (функция) F, зависящий от некоторого числа переменных (значений), включая N параметров функции и некоторого количества "свободных" переменных (т.е. определённых вне тела функции, но доступных в теле функции на момент его выполнения).
    2. У вас есть другая функция G, требующая для своей работы некоторую функцию, зависящую от M параметров (причём N > M).
    3. У вас есть желание использовать функцию F как параметр функции G, однако для этого необходимо заранее задать значения всех аргументов, которые G не будет передавать в F (т.е. тех, которые не входят во множество параметров M), а также значения всех свободных переменных (иначе код функции F невозможно будет выполнить).
    4. Для реализации этого намерения вы примените замыкание (иначе просто невозможно).

    Остальное зависит от языка программирования и конкретной ситуации.
    В любом языке основная задача замыкания - связать код функции и данные, с которыми она работает. Эту же задачу связывания кода и данных решают и объекты.
    Ответ написан
    1 комментарий
  • Простым языком о замыканиях?

    @windsteppy
    Trainee разработчик
    Описание наиболее просто описать, как функцию (или метод, как назовешь - не важно), которая помнит о своем окружении - переменных, других функциях, причем чаще всего, это окружение недоступно в глобальном / ином контексте исполнения. Чаще всего, это функция внутри другой функции, по крайней мере, в контексте JS.
    Код замыкания с пояснениями
    Ответ написан
    Комментировать
  • Простым языком о замыканиях?

    miraage
    @miraage
    Старый прогер
    1) чтобы сохранить переменные для будущего использования
    2) посредством вызова функции, которая вернет другую новую функцию.
    Ответ написан
    Комментировать
  • Почему не создаётся замыкание?

    Вопрос странный, смею предположить, что вы хотели узнать почему this.firstName ничего вам не возвращает.
    Если так то дело в области видимости функций.
    Юзайте стрелочные функции и будет вам счастье. Ну и почитайте про функции конечно же.
    let user = {
            firstName: "Вася",
            sayHi: () => {
                console.log( this.firstName );
            }
        };
        user.sayHi();
    Ответ написан
    1 комментарий
  • Как передать в функцию свойство DOM элемента, а затем изменить его?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function setStyleProp(elem, property, value) {
      elem.style[property] = value;
    }
    
    setStyleProp(document.getElementById('test'), 'opacity', 0);
    Ответ написан
    Комментировать
  • Как вернуть результат из setInterval?

    rockon404
    @rockon404
    Frontend Developer
    Почему функция возвращает undifinded?

    Потому что функция f синхронно отрабатывает и не возвращает никакого результата.

    Как вернуть результат из setInterval?

    Можно захардкодить, можно использовать колбек или Promise.
    Хардкод:
    function f() { 
      setTimeout(console.log, 500, 1);
    }
    
    f(); // 1


    Колбек:
    function f(cb) { 
      setTimeout(cb, 500, 1);
    }
    
    f(console.log); // 1


    Promise:
    function f() {
      return new Promise(resolve => {
        setTimeout(resolve, 500, 1);
      });
    }
    
    f().then(console.log); // 1
    Ответ написан
    Комментировать
  • Как изменять свойство в конструкторе через setInterval?

    Stalker_RED
    @Stalker_RED
    В конструкторе let x = this
    А внутри таймаута x.num++
    Ответ написан
    Комментировать
  • Как получить массив файлов из определённой директории?

    rockon404
    @rockon404
    Frontend Developer
    На стороне севрвера:
    const fs = require('fs');
    
    fs.readdir('./folder', (err, files) => {
      files.forEach(file => {
        console.log(file);
      });
    })

    fs.readdir
    Ответ написан
    Комментировать
  • Как получить все элементы DOM в виде массива?

    alvvi
    @alvvi
    export default apathy;
    Array.prototype.slice.call( document.querySelectorAll('*')  )

    или
    Array.from( document.querySelectorAll('*') )
    Ответ написан
    3 комментария
  • Почему так происходит?

    LaRN
    @LaRN
    Senior Developer
    Если вы присваиваете значение tempScrollTop до сравнения с currentScrollTop то заменяете предыдущее значение в tempScrollTop на currentScrollTop и ваши последующие проверки не срабатывают, т.к. переменные теперь равны.
    Ответ написан
    Комментировать
  • Почему так происходит?

    KickeRocK
    @KickeRocK
    FrontFinish
    Читайте про if'ы больше, чтобы не возникало таких вопросов.
    Если присваивание(приравнивание) переменных вверху:
    У вас они в любой момент скролла равны по-дефолту, захода в if нет.
    Как я понял, вы хотите чтобы при скролле вверх, на каждом проскролле, выводилось "вверх" и вниз - "вниз"?
    Вам для этого надо сохранять предыдущую позицию и с ней сравнивать(изначально она должна быть в нуле).
    var tempScrollTop=0,
     currentScrollTop;
    $(window).scroll(function(){
        currentScrollTop = $(window).scrollTop();
        if (tempScrollTop < currentScrollTop ){
            alert("Вниз");
        }
        else if (tempScrollTop > currentScrollTop ) {
            alert("Вверх");
        }
         tempScrollTop = currentScrollTop;
    });
    Ответ написан
    Комментировать
  • Какая разница между данными вариантами?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Первый плох, что в одной строке две переменные объявляются.
    Второй плох тем, что два var.

    Я бы так (сейчас заминусуют.. А, нет, тут нельзя минусовать : )
    var tempScrollTop
      , currentScrollTop = 0
    ;

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

    Upd. Главное же различие в том, что в 1-м варианте переменная tempScrollTopостаётся неинициализированной, её значение undefined, а во 2-м варианте ей даётся начальное значение 0.
    Ответ написан
    6 комментариев
  • Почему так происходит?

    rework
    @rework
    Помог ответ? В благодарность отметь его решением
    1. var - задаёт область видимости переменной, если вы перед строкой tempScrollTop = currentScrollTop; укажите var, то при следующем вызове функции в переменной не сохраняется предыдущего значения.

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

    3. Во втором варианте переменная инициализируется значением равным 0
    Ответ написан
    2 комментария