2009-07-14 3 views
2

샘플 코드를 가리 키지 않습니다 자바 스크립트이 바로 객체에

function TestClass() { 

this.init = function() { 

    this.updateHeader(); // <-- error line 

}; 

this.updateHeader = function() { 
    console.log("Works"); 
}; 

}; 
var test = new TestClass(); 
$(document).ready(test.init); 

나는 파이어 폭스 3.5, 파이어 버그는 this.updateHeader가 유효한 기능 아니라고 말하고, 나에게 오류를 제공하는 것이 실행

. 저는 Java/PHP 프로그래머이고 Javascript OO 모델을 이해하는 데 어려움을 겪고 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

$ (document) .ready-line을 단순히 test.init()로 바꾸면 작동하지만 원하지 않습니다.

답변

4

test.init 함수를 ready() 함수에 직접 전달하면 test.init을 콜백 함수로 등록하게됩니다. jQuery (당신이 사용하고있는 구문으로 판단 할 때)는 주어진 콜백 함수를 사용하고 document의 컨텍스트에서 적용합니다. 즉 키워드는 document을 의미합니다. 설정하는 클로저를 정의 할 function() { } 구문을 사용

$(document).ready(function() { 
    test.init(); 
}); 

: 당신이 이것을 방지하기 위해 무엇을해야

는, 제안, 당신이 참조하는 함수를 호출합니다 익명 함수 (폐쇄)를 사용하는 것입니다 콜백 함수는 Javascript에서 일반적인 패턴이므로

+0

생각해 보면 이해할 수 있습니다. :) –

1

해당 상황에서 "this"는 그 안에 포함 된 기능에 적용됩니다.

1

준비 $(document).ready(function() { test.init(); });

()는 문서가 준비 될 때 실행할 것이다 인자로서의 기능을 기대보십시오. 그럴 경우 thisdocument 개체를 가리키고 test이 아닙니다.

해결책은 명시 적으로 초기화 코드를 test.init()과 함께 호출하는 것입니다. 그런 식으로 전화하면 test 개체를 가리키는 this (init 함수에서)입니다.

3

문서 준비 함수에 test.init을 제공하면 실제로 테스트의 init 함수에 대한 함수 포인터가 제공됩니다.

기본적으로 init 함수를 추출하여 문서 준비 함수의 범위 내에서 실행합니다.

$ (document) .ready (function() {test.init();}로 실행 한 경우); (Patrick이 말했듯이) 적절한 범위에서 실행됩니다.

관련 문제