Почему этот 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
);