>웹 프론트엔드 >JS 튜토리얼 >JavaScript에서 setTimeout을 사용할 때 \'this\' 참조를 유지하는 방법은 무엇입니까?

JavaScript에서 setTimeout을 사용할 때 \'this\' 참조를 유지하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-24 11:35:29820검색

How to Preserve the

setTimeout 및 JavaScript의 파악하기 어려운 "this"

setTimeout 함수를 사용할 때 개발자는 메서드에 대한 후속 호출이 손실되는 문제에 자주 직면합니다. 의도된 컨텍스트로 인해 정의되지 않은 것처럼 보이는 메서드가 발생합니다. 이는 일반적으로 "this" 참조가 손실되어 발생합니다.

문제:

다음 코드를 고려하세요.

test.prototype.method = function() {
    //method2 returns image based on the id passed
    this.method2('useSomeElement').src = "http://www.some.url";
    timeDelay = window.setTimeout(this.method, 5000);
};

test.prototype.method2 = function(name) {
    for (var i = 0; i < document.images.length; i++) {
        if (document.images[i].id.indexOf(name) > 1) {
            return document.images[i];
        }
    }
};

On 초기 페이지 로드 시 method2 함수는 의도한 대로 작동합니다. 그러나 시간 제한을 설정한 후 이후에 method2를 호출하면 정의되지 않았다는 오류가 발생합니다.

해결 방법:

핵심 문제는 setTimeout이 처리하는 방식에 있습니다. this 키워드. setTimeout(this.method, 5000)을 사용하여 시간 제한을 설정하면 컨텍스트가 손실되어 오류가 발생합니다.

이 문제에 대한 영리한 해결책은 바인딩() 메서드를 사용하는 것입니다. 메서드 호출 끝에 ".bind(this)"를 추가하면 컨텍스트를 명시적으로 바인딩할 수 있으므로 시간 초과 후에도 올바른 "this" 참조가 유지됩니다.

향상된 코드 :

test.prototype.method = function() {
    //method2 returns image based on the id passed
    this.method2('useSomeElement').src = "http://www.some.url";
    timeDelay = window.setTimeout(this.method.bind(this), 5000);
    //                                       ^^^^^^^^^^^ <- fix context
};

이 수정을 통해 "this"의 컨텍스트가 올바르게 바인딩되어 제한 시간이 만료된 후에도 method2가 의도한 대로 계속 작동할 수 있습니다. 이 접근 방식은 올바른 실행 컨텍스트를 유지하는 데 있어 우아하면서도 효과적입니다.

위 내용은 JavaScript에서 setTimeout을 사용할 때 'this' 참조를 유지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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