나는 타이머에 메서드를 실행하는 jQuery 플러그인을 만들려고합니다. 페이지의 여러 요소를 독립적으로 작업하고 싶습니다. 각 요소에 대해 타이머가 실행되는 지점에 도달했지만 setTimeout에서 호출 된 메서드는 플러그인의 마지막 인스턴스에 대해서만 알 수 있습니다.자바 스크립트 범위 문제가 개체 및 setTimeout
저는 근본적으로 바보 같은 일을하고있는 것을 알고 있습니다. 그러나 무엇을 안다면 나는 위험합니다. 나는 이것 같은 물건이 전에 여기에 800 만 번 물었다는 것을 안다. 그러나 나는 나의 특정한 문제와 관련된 대답을 찾을 수 없었다.
다음은 내가하는 작업의 구조를 보여주는 스크립트입니다.
0
1
1
1
1
1
내가 얻을 것으로 예상 출력은 이것이다 :
<html>
<head>
<script type="text/javascript" src="assets/jquery.min.js"></script>
<script type="text/javascript">
var crap = 0;
(function($)
{
jQuery.fn.pants = function(options) {
var trousers = {
id: null,
current: 0,
waitTimeMs: 1000,
begin: function() {
var d = new Date();
this.id = crap++;
console.log(this.id);
// do a bunch of stuff
window.setTimeout(function(self) {return function() {self.next();}}(this), this.waitTimeMs);
},
next: function() {
this.current ++;
console.log(this.id);
window.setTimeout(function(self) {return function() {self.next();}}(this), this.waitTimeMs);
},
};
options = options || {};
$.extend(trousers, options);
this.each(function(index, element) {
trousers.begin();
});
return this;
};
}
)(jQuery);
jQuery(document).ready(function() {
jQuery("div.wahey").pants();
});
</script>
</head>
<body>
<div class="wahey"></div>
<div class="wahey"></div>
</body>
</html>
내가 얻을 출력은 이것이다
0
1
0
1
0
1
문제를 해결하려면 어떻게해야합니까? – Shabbyrobe
대신 범위 별 변수를 사용하십시오. http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/ 하단을 보면 "악명 높은 루프 문제"에 대해 이야기하고 있습니다. – Malfist