Хобрук: Ваш путь к мастерству в программировании

Та же проблема с циклом закрытия JS, но ответы SO не работают [дубликаты]

Возможный дубликат:
Как работают замыкания JavaScript?

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

for (var i in groups){
    for(var j in groups[i]){
        $(unique_form).die('submit').live('submit'), function{
             function (groups2, i2, j2){
                 return function(){alert(groups2[i2][j2])}
              }(groups, i, j)
             }
         });
        }               
    }
 }

Когда я отправляю каждую уникальную форму, я продолжаю получать предупреждение о последнем элементе групп[i][j]. Очевидно, я делаю что-то глупое, что это? Я думал, что, создав анонимные группы функций2, i2 и j2, я решил проблему.


  • Замыкания не работают для объектов (по крайней мере, в JavaScript), так как заключена только ссылка на объект. 17.01.2013
  • Что вы пытаетесь сделать с этим странным кодом?! 17.01.2013
  • Предполагается, что закрытие находится вне обработчика событий, поэтому ссылки будут существовать внутри обработчика событий. 17.01.2013
  • К вашему сведению, live and die устарели. 17.01.2013
  • Ни при каких обстоятельствах не создавайте функцию внутри цикла. 17.01.2013

Ответы:


1

Функция, которую вы передаете .live(), выполняется когда запускается событие отправки. К этому моменту i и j будут иметь свои окончательные значения. Вам нужно будет создать замыкание снаружи обработчика событий:

(function (i2, j2) {
    $(unique_form).die('submit').live('submit', function{
        alert(groups[i2][j2])
    });
}(i, j));

Обратите внимание, что я удалил аргумент groups из анонимной функции. Нет необходимости закрывать это, так как его значение не изменится. Я также заключил все выражение функции в круглые скобки, что является соглашением (и в этом случае действительно требуется, чтобы заставить его анализироваться как выражение).

Также обратите внимание, что я удалил закрывающие скобки, которые у вас есть после первого аргумента .live() в вашем вопросе. Этого не должно быть.


Примечание.

.live() и .die() давно устарели. Используйте .on() (с jQuery 1.7+) или .delegate() (с более ранними версиями).

16.01.2013
  • +1 не забудьте удалить эти ошибочные скобки live('submit') ‹-- 17.01.2013
  • @wirey - Спасибо, хорошее место! 17.01.2013
  • @JamesAllardice: отличный ответ. 17.01.2013
  • Спасибо большое, очень, очень большое. Вы точно объяснили, почему мой код не работает, и предложили рабочее решение. Я очень ценю это. 17.01.2013
  • @ScottW - Пожалуйста, рад, что смог помочь :) 17.01.2013

  • 2

    Ваш код устанавливает groups.length в квадрате обработчиков отправки в реальном времени. Каждый живой обработчик состоит из другой копии этой функции:

    function{
        function (groups2, i2, j2){
            return function(){alert(groups2[i2][j2])}
        }(groups, i, j)
    }
    

    Когда происходит событие отправки, все активные обработчики файлов, каждый из которых ссылается на последнее значение i и j.

    Трудно сказать, чего вы действительно хотите, основываясь на фрагменте кода, с дополнительной информацией я, вероятно, мог бы помочь больше. Удачи!

    16.01.2013

    3

    Попробуйте это

    for (var i in groups){
        for(var j in groups[i]){
            $(unique_form).die('submit').live('submit', function( groups2, i2, j2 ){
                 return function (){
                     alert(groups2[i2][j2])
                 }
             }(groups, i, j) );
            }               
        }
     }
    
    16.01.2013
    Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

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

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..