2012-07-20 4 views
13

다음 예에서 self 대신 this을 직접 사용할 수없는 이유는 무엇입니까?Javascript의 클래스에서 "var self = this"가 필요한 이유는 무엇입니까?

function SeatReservation(name, initialMeal) { 
    var self = this; 
    self.name = name; 
    self.meal = ko.observable(initialMeal); 
} 

는 응답 후, 나는 배운 : 클래스에는 컨텍스트 스위치가없는 경우

예, 필요가 없습니다.

하지만이 방법은 필요하지 않지만 "규칙"으로 사용합니다.

답변

21

당신이 직접이 this를 사용할 수없는 이유 이유가 없다 (그리고 나는 당신 를 한 경우는 가독성을 위해 더 나은 것 말할 것이다).

그러나, var self = this;은 종종 다음 (이벤트 같은 기본적으로 비동기 작업을 바인딩, AJAX 핸들러 등 this의 해상도가이 뭔가에 달할 때까지 을 연기되는 경우)와 같은 상황에서 필요하다;

function SeatReservation(name, initialMeal) { 
    var self = this; 
    self.name = name; 
    self.meal = ko.observable(initialMeal); 

    setTimeout(function() { 
     alert(self.name); // otherwise, this is window; use self to keep a reference to the "SeatReservation" instance. 
    }, 100); 
} 
+0

는 생성자의 실행에서는 setTimeout합니까 :

다음 기사에서 자세한 내용을 찾을 것인가? 아니면 수업의 방법인가요? – ozz

+0

@ozz : ['window.setTimeout']에 대한 문서를 참조하십시오 (https://developer.mozilla.org/en/DOM/window.setTimeout); 지정된 밀리 초 동안 제공된 함수의 실행을 지연시킵니다. – Matt

+0

setTimeout을 사용하면 매개 변수를 전달할 수도 있습니다. 즉 http://jsfiddle.net/gRoberts/rYB3f/ 예에서 'this'를 'self'로 재 선언해야 할 필요성을 제거합니다. – Gavin

3

예제에 따르면,이 작업을 수행하는 이유가 없습니다.

일부 경우 사용법에 싫증이 났지만 도움이되는 경우가 있습니다. 범위가 손실 된 것처럼 성공 및 오류 콜백 내에서 위의에서 즉

$('a.go').click(function(e) 
{ 
    e.preventDefault(); 
    if(!$(this).hasClass('busy')) 
    { 
     $(this).addClass('busy'); 
     $.ajax(
     { 
      success : function(resp) 
      { 
       $(this).removeClass('busy'); 
      }, 
      error : function() 
      { 
       $(this).removeClass('busy');     
      } 
     }); 
    } 
}); 

, $(this), 당신은 클릭 링크에 반영하지 않을 것입니다. 이 문제를 해결, 당신이 당신의 예제 코드에서 var self = $(this)

$('a.go').click(function(e) 
{ 
    e.preventDefault(); 
    if(!$(this).hasClass('busy')) 
    { 
     $(this).addClass('busy'); 
     var btn = $(this); 
     $.ajax(
     { 
      success : function(resp) 
      { 
       btn.removeClass('busy'); 
      }, 
      error : function() 
      { 
       btn.removeClass('busy');     
      } 
     }); 
    } 
}); 
+5

물론 기술적 인면은 정확하지만 답은 다음과 같습니다. ** jQuery! = javascript **!jQuery 구문을 사용하여 광범위한 자바 스크립트 질문에 대답하는 것은 초보자에게 혼동을 줄 수 있습니다. – cypherabe

+0

당신의 오른쪽 그러나 초보자는 거의 원시 자바 스크립트를 배우지, 그들은 대부분의 경우 jQuery를 사용하여 결과를 구글 솔루션을 검색하는 경향이 있습니다. 그것은 양날의 칼입니다. 네이티브 javascript 예제를 제공했다면 jQuery 기반 자바 스크립트 만 알고있는 사람은 혼란 스러울 것입니다. – Gavin

+0

JQuery는 네이티브 javascript입니다. 그것은 DOM 처리 네이티브 아니에요. 혼란이 깊어집니다. – frostymarvelous

5

변수에 this을 복사 할 모든 이유가 없다 할 것

얻을합니다.

일반적으로 코드에서 콜백 메소드를 사용할 때 사용됩니다. 콜백 메소드 this은 객체를 참조하지 않으므로 변수를 사용합니다.

관련 문제