2012-09-06 1 views
0

참고 : 코드가 길어 보이지만 데모 목적으로는 간단한 psuedo 코드입니다. 도망 가지 마!JQuery 위젯, "this"에 대한 참조가 손실 됨

키 입력을 수신하는 위젯을 작성했습니다. onKeyDown 이벤트가 발생하면 this에 대한 참조가 손실됩니다. 그래서 위젯을 참조하기 위해 self이라는 범위 변수를 설정했습니다. self은 위젯이 작성 될 때 초기화됩니다.

이 방법이 효과적이지만 올바른 방법인지는 확실하지 않습니다. 나는 여기의 해결책이 프록시와 관련이 있다고 생각한다. 아마도 self 변수가 이미 프록시 역할을 수행하고 있습니까? 누군가는 일어나고있는 무슨을에 약간 빛을 비춰주고 싶 는다?

(function($) 
{ 
    var vendorPrefix = Modernizr.prefixed("transform"); 
    var self; 

    $.widget("ui.myWidget", { 

     _create: function() 
     { 
      self = this;    
      //Do some widget stuff 
      document.addEventListener('keydown', this.onKeyDown, false) 
      return this; 
     }, 

     exampleFn: function() 
     { 
     }, 

     onKeyDown: function(event) 
     { 
      // this now refers to "document" and not the widget    
      switch(event.keyCode) 
      { 
       case 37: 
        self.exampleFn(); 
        break; 
       case 39: 
        self.exampleFn(); 
        break; 
      } 
     } 

    }); 
})(jQuery); 
+0

'자가 사용 = this' 완벽하게 유효합니다. –

답변

0

또한 jQuery.proxy()를 사용할 수 있습니다

onKeyDown: $.proxy(function(event) 
{ 
    // this now refers to "document" and not the widget    
    switch(event.keyCode) 
    { 
     case 37: 
      this.exampleFn(); 
      break; 
     case 39: 
      this.exampleFn(); 
      break; 
    } 
}, this) 

어쨌든, 무엇이 일어나고있는 것은 함수에서 this 그 기능을 의미한다는 것이다. 그래서 thisonKeyDownonKeyDown 기능입니다. 위와 같이 프록시를 사용하면 onKeyDown에있는 this은 상위 함수에 대한 참조가됩니다. 자바 스크립트에서 this 행동에

더 : How does the "this" keyword work?

+0

안녕하세요 파웰, 이건 제가 생각하고 있던 것입니다. 나는 내가 "자기"를 성공적으로 스코프했는지 아닌지에 관해 조금 확신 할 수 없다. 나는 무엇을 해야할지에 대해 약간의 갈등이 있습니다. "this"는 실제로 이벤트를 참조해야합니다. 왜냐하면 예상되는 동작이 thats이기 때문에 동시에 위젯 내에서 이벤트를 제한하려고 노력하고 있기 때문입니다 ... – JonWells

+0

내가 사용하기 위해 프록시를 적용 할 수 없습니다. 이 "document.addEventListener ('keydown', $ .proxy (this.onKeyDown, this), false);" – JonWells

+0

'self' 변수로 접근하는 것도 괜찮다고 생각합니다. 변수가 선언 된 함수 밖에서는 사용할 수 없습니다. 나는 그런 식으로 종종 그것을한다 - 그것은 내가 무엇이 필요한지에 달려있다. 하지만 저는 JavaScript 닌자가 아닙니다. :) –

0

"this"키워드는 이벤트가 첨부 된 개체를 참조하기 때문입니다.

자기 팁을 사용하는 것이 좋습니다.

0

나는 프록시가 의미하는 바가 javascript에는 없다는 것이 확실하지 않지만, 본질적으로 전역 변수를 만들었으므로 올바른 방법은 아닙니다.

예를 들어 위젯이 여러 번 초기화 된 경우 코드에 따라 실제로 이상한 동작이 나타날 수 있습니다.

전역 var self을 제거하고 개체 선언 내에서 _create 메서드 위로 이동하여 개체에 대한 개인 변수가되도록합니다. 당신이 self 변수를 제거하려는 경우

+0

'var self'는 그 함수의 범위에서 전역인가요? – MalSu

+0

"proxy"개념은'$ .proxy'가 보여주는 행동을 나타냅니다. – pimvdb

+0

@MalSu - 자체 글로벌인가요? 나는 그 기능 범위 내에서 그 범위를 결정했다고 생각 했는가? – JonWells