c ++: копирование по значению в функцию params создает два объекта в vs2012

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

В приведенном ниже примере переменная currentList передается в IIFE, которая сохраняет ее при ее закрытии , пока не будет вызвана функция задержки. Даже если переменная currentList изменяется сразу после показанного кода, setInterval() будет поступать правильно.

Без этой техники IIFE функция setTimeout(), безусловно, будет вызвана для каждого h2 элемент в DOM, но все эти вызовы будут видеть только текстовое значение последнего элемента h2.

<script>
  // Wait for the document to load.
  $(document).ready(function() {
  $("h2").each(function (index) {

    currentList = $(this).text();

    (function (param1, param2) {
        setTimeout(function() {
            $("span").text(param1 + ' : ' + param2 );
        }, param1 * 1000);

    })(index, currentList);
  });
</script>
23
задан cnd 14 November 2012 в 08:23
поделиться