Ответ Дэвида Майстера, похоже, позаботится о параметрах, которые могут измениться сразу после вызова 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>