Почему этот Javascript setInterval с функцией вызова объекта не оценивает внутренний параметр при передаче обратного вызова?

Следующий скрипт выводит 1 2 3 4 5 6 7.. Я предполагаю, что он выведет 0 1 2 3 4 5 ...

На самом деле, в моем реальном коде я считаю, что print(lostCnt) всегда связан с последним (действующим как глобальное) последним обновлением счетчика. Почему это? И что я могу сделать, чтобы он сохранил фактический cnt с ограничением, что я не могу изменить любой код в obj1.

<!DOCTYPE html>

<html>
<head>
<script type="text/javascript">
function obj1(parameter, callback){
    setTimeout(callback, parameter);
}
function caller(){
    function miscFunction(cnt){
        document.getElementById("main").appendChild(document.createTextNode(cnt));
    }
    var lostCnt = 0;
    setInterval(
        function(){
            new obj1(5, 
                function(){
                    miscFunction(lostCnt);
                });
           lostCnt++;
        },5000
    );
}   
</script>


</head>
<body onload="caller();">
<div id="main">
</div>
</body>

</html>

Спасибо, и это мой первый пост

1 ответ

Решение

lostCnt++ выполняется до первого вызова miscFunction(),

obj1 Конструктор не показывает число до 5 миллисекунд после его создания. Только в этот момент вызывается обратный вызов, и ссылки на обратный вызов lostCnt напрямую - не сохраненная копия того, что было, когда obj1 Экземпляр был создан.

Таким образом, ваше предположение верно, и я думаю, что это довольно очевидно - обратный вызов передан obj1 конструктор ссылается lostCnt непосредственно.

Если вы хотите сделать это по-другому, вы можете сделать это:

setInterval(
    function(){
        new obj1(5, 
          function(savedLostCnt) {
            return function(){
                miscFunction(savedLostCnt);
            };
          }(lostCnt));
        lostCnt++;
    },5000
);
Другие вопросы по тегам