문제는 (적어도 내가 본 첫 번째) 문자열 "증분 (obj)"을 setTimeout()
메서드로 전달하지만 obj
은 start()
메서드 내에서만 정의됩니다. 전달한 문자열은 시간 제한 트리거가 발생할 때까지 실제로 평가되지 않습니다.이 시점에서 변수는 범위에 없습니다. obj
변수가 범위 내에 있습니다.
이 문제를 해결하는 데는 몇 가지 방법이 있습니다. 하나는 같은 대신 자바 스크립트 문자열의 setTimeout()
에 클로저를 전달하는 것입니다 :
function start(obj) {
var nextIncrement = function() {
increment(obj);
};
var t = setTimeout(nextIncrement, 1000);
}
또 다른 (덜 바람직하지만) 옵션이 같이 전역에 obj
을 촉진하는 것입니다 일반적으로
function start(obj) {
window.obj = obj;
var t = setTimeout("increment(obj)", 1000);
}
그러나 문자열을 setTimeout
으로 전달하지 않아야합니다. 또한 불필요하게 전역 범위에 배치하지 않아야합니다. 앞서 보았 듯이 범위 분석에 문제가 발생할 수 있으며 중요한 작업이 아니라면 코드를 훨씬 쉽게 유지 관리 할 수 없게됩니다. 가능한 경우 항상 함수 클로저를 전달하는 것을 선호합니다.
또한, 다음 코드 줄을 probably not doing exactly what you expect입니다 :
이
parseInt(obj.innerHTML)
당신은 항상 parseInt
에 기수 인수를 제공해야한다, 9입니다 같은 011
같은 값 (보다는 11 오류를 방지 할 때문에 선도자가 0
이기 때문에 8 진수로 평가됩니다.
parseInt(obj.innerHTML, 10)
... 기본 -10 구문 분석을 강제 실행하면 이러한 단점을 피할 수 있습니다. 당신의 obj
객체를 참조하지 않습니다 그래서 당신은 setTimeout
에 전달하는 문자열, 글로벌 범위에서 함수 내되지 범위를 평가 http://jsfiddle.net/dSLZG/1
'setTimeout'이 아니라'setInterval'이 필요합니다. – FK82
@ fk82 그는 다시 start를 호출하므로 setTimeout은이 시나리오에서는 문제가 없습니다. –
@Gaby : 모호합니다. 코드는 그렇게 할 것입니다. 하지만 실제로는 의도가 "(...)
의 내용이 매초마다 1 씩 증가되어야한다고 생각합니다."':-) 사용자가 매초마다 정확하게 클릭하지 않으면 발생하지 않는 오류가 있습니다. – FK82