2010-05-11 6 views
0

나는 타이머에 메서드를 실행하는 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 

답변

0

그것은 당신 '이'인 사용하고 있는지 수 브라우저 특정 및 항상 point to what you want it to point to하지 않습니다. 이것은 함수의 소유자가 아니라 함수의 객체에 속합니다.

+0

문제를 해결하려면 어떻게해야합니까? – Shabbyrobe

+0

대신 범위 별 변수를 사용하십시오. http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/ 하단을 보면 "악명 높은 루프 문제"에 대해 이야기하고 있습니다. – Malfist