Как передать переменную значением к анонимной функции JavaScript?

Самая близкая вещь к единственному "ответу" System.exit(), который сразу завершает JVM без надлежащей очистки. Но кроме этого, собственный код и исчерпание ресурса являются наиболее вероятными ответами. Кроме того, можно пойти, считая средство отслеживания ошибки Sun для ошибок в версии JVM, некоторые из которых допускают повторяемые сценарии катастрофического отказа. Мы раньше получали полурегулярные катастрофические отказы при приближении к пределу памяти на 4 Гбита под 32-разрядными версиями (мы обычно используем 64-разрядный теперь).

22
задан rism 30 July 2009 в 01:53
поделиться

3 ответа

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

Однако простое перемещение объявления переменной в цикл выиграло 'не достигают этого, потому что JavaScript не вводит новую область видимости для произвольных блоков .

Один простой способ принудительно ввести новую область видимости - использовать другую анонимную функцию:

for (var i=0;i<inlineRangeNavUrls.length;i++)
{
  curDiv='#' + inlineRangeNavUrls[i][1];
  if ($(curDiv).length)
  {
    (function(curTab)
    {
      $(curDiv).bind("mouseover", function(){showHideRangeSlidingTabs(curTab, true);} );
      $(curDiv).bind("mouseout", function(){showHideRangeSlidingTabs(curTab, false);} );
    })(inlineRangeNavUrls[i][0]); // pass as argument to anonymous function - this will introduce a new scope
  }
}

Как Джейсон предлагает , вы можете немного очистить это, используя встроенную в jQuery функцию hover () :

for (var i=0;i<inlineRangeNavUrls.length;i++)
{
  (function(curTab) // introduce a new scope
  {
  $('#' + inlineRangeNavUrls[i][1])
    .hover(
      function(){showHideRangeSlidingTabs(curTab, true);},
      function(){showHideRangeSlidingTabs(curTab, false);} 
    );
  // establish per-loop variable by passsing as argument to anonymous function
  })(inlineRangeNavUrls[i][0]); 
}
23
ответ дан 29 November 2019 в 04:40
поделиться

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

вам нужно изменить это:

$(curDiv).bind("mouseover", function(){showHideRangeSlidingTabs(curTab, true);} );

на это:

$(curDiv).bind("mouseover", 
    (function (mylocalvariable) { 
        return function(){
            showHideRangeSlidingTabs(mylocalvariable, true);
        } 
    })(curTab) 
);

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

Ответ shog9 выполняет в основном то же самое, но его код немного более строгий.

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

edit: ой, забыл вернуть внутреннюю функцию. Исправлено.

17
ответ дан 29 November 2019 в 04:40
поделиться

Я думаю, вы усложняете это более сложным, чем должно быть. Если все, что вы делаете, это назначаете эффект скольжения при наведении / закрытии курсора мыши, попробуйте применить эффект hover с помощью jquery.

$("#mytab").hover(function(){
    $(this).next("div").slideDown("fast");},
  function(){
    $(this).next("div").slideUp("fast");
});

Если вы разместили полный HTML-код, я мог бы точно сказать вам, как это сделать:)

1
ответ дан 29 November 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: