>웹 프론트엔드 >JS 튜토리얼 >JavaScript 콜백 내에서 'this'에 올바르게 액세스하려면 어떻게 해야 합니까?

JavaScript 콜백 내에서 'this'에 올바르게 액세스하려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-07 19:19:02672검색

How Can I Access

JavaScript 콜백의 유사성

JavaScript에서 이벤트 핸들러 콜백 내의 인스턴스 메소드를 활용하면 "this"의 범위가 의도한 범위에서 변경될 수 있습니다. 콜백을 호출한 소스에 대한 인스턴스입니다. 결과적으로 아래 예제와 유사한 코드가 자주 사용됩니다.

function MyObject() {
  this.doSomething = function() {
    ...
  }

  var self = this
  $('#foobar').bind('click', function(){
    self.doSomethng()
    // this.doSomething() would not work here
  })
}

기능적이긴 하지만 이 접근 방식은 이상해 보일 수 있습니다. 더 최적의 솔루션이 있습니까?

클로저 및 "this" 선호도 이해

이 문제는 jQuery를 넘어 JavaScript의 "this" 및 클로저 처리에서 비롯됩니다. 클로저는 아래 그림과 같이 중첩된 함수가 둘러싸는 함수에 정의된 변수에 액세스할 수 있도록 해줍니다.

var abc = 1; // we want to use this variable in embedded functions

function xyz(){
  console.log(abc); // it is available here!
  function qwe(){
    console.log(abc); // it is available here too!
  }
  ...
};

그러나 "This"는 다르게 동작합니다. 특정 범위 내에서 일정하게 유지되는 일반 변수와 달리 "this"는 범위에 따라 동적으로 달라질 수 있습니다.

// we want to use "this" variable in embedded functions

function xyz(){
  // "this" is different here!
  console.log(this); // not what we wanted!
  function qwe(){
    // "this" is different here too!
    console.log(this); // not what we wanted!
  }
  ...
};

해결책: "this"에 별칭 지정

이를 방지하려면 문제는 JavaScript를 사용하여 "this"를 변수에 할당하여 본질적으로 별칭을 지정할 수 있다는 것입니다. 이를 통해 중첩된 함수 전체에서 의도한 객체를 참조할 수 있습니다.

var abc = this; // we want to use this variable in embedded functions

function xyz(){
  // "this" is different here! --- but we don't care!
  console.log(abc); // now it is the right object!
  function qwe(){
    // "this" is different here too! --- but we don't care!
    console.log(abc); // it is the right object here too!
  }
  ...
};

이 동일한 원칙이 "인수"와 같은 다른 의사 변수에도 적용됩니다.

위 내용은 JavaScript 콜백 내에서 'this'에 올바르게 액세스하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.