2012-01-19 4 views
3

가 발생합니다 :이유는이 객체이지만 직접 호출은 다음과 같이 오류

function Person() { 
    this.name = "john"; 
    this.getName = function() { 
     return this.name; 
    }; 
} 

var me = new Person(); 

왜하고자했다 절차 :

setTimeout(function(){alert(me.getName())}, 3000); 

반환 john 동안 진행 :

setTimeout(me.getName(), 3000); 

는 만들

Uncaught TypeError: Object [object DOMWindow] has no method 'getName' 
+0

이것은 귀하의 코드가 될 수 없습니다. 나는'setTimeout (me.getName(), 3000); 라인을 가정하고있다.'var me = new Person();'라인을 직접 진행하지는 않는다. 게다가, 당신은'setTimeout (me.getName, 3000);'(괄호 안 함) – rgthree

+0

@rgthree "(괄호 안 함)"- 굉장합니다. – benekastah

답변

3

문제는 setTimeout이 첫 번째 인수로 함수를 사용한다는 것입니다. 당신의 코드에서

:

에서는 setTimeout (함수() {경고 (me.getName())}, 3000);

함수를 첫 번째 인수로 전달하고 첫 번째 인수로 경고를 평가합니다.

두 번째 조각에서 당신은 기능 그래서이 호출의 결과에 전달되고 있습니다

에서는 setTimeout (me.getName(), 3000);

이되다 :

의 setTimeout ('존', 3000);

setTimeout 방식으로 인해 런타임에서 오류가 발생하는 함수로 호출하려고 시도하는 첫 번째 인수로 문자열을 전달할 수 있습니다.

+0

오류 메시지가'john'이 아닌'getName'을 참조하는 이유 – zode64

2

사용하신 코드가 맞습니까? setTimeout(me.getName(), 3000)me.getName을 호출하고 그 결과를 setTimeout의 첫 번째 인수로 전달합니다. 당신이 setTimeout(me.getName, 3000)을 의미하는 경우 기능이 me에 바인딩되지 않기 때문에

그렇게 setTimeoutwindow (어디부터 me을 얻을 것? 당신은 함수 자체를 통과)의 맥락에서 그것을 실행,입니다.

setTimeout (me.getName.bind (me), 3000); 

이 이전 버전의 브라우저에서 사용할 수 없지만 MDN page은 대체 구현이 있습니다

대신 익명 함수 내에서 전화를 넣어, 당신은 바인딩을 사용할 수 있습니다.

1

정답으로 질문에 태그를 추가했습니다 (클로저). 익명 함수에서 코드를 래핑 할 때 이라는 로컬 변수의 값을 캡처하는 클로저를 만듭니다.

제임스 (James)는 문제의 일부분이 약간 이상하다고 지적했기 때문에.

+0

클로저 내부에서 'me' 변수를 캡처하는 방법이 명확하지 않습니다 (클로저가 정의 된 위치와 아무 관련이 없기 때문에). 변수가 클로저 밖에서 'me.'를 사용할 수없는 경우 – zode64

+0

더 많은 코드를 보지 않고도 정확하게 말하기는 어렵지만 기본적으로 클로저는 클로저가 작성된 지점에서 액세스 가능한 모든 변수를 포착합니다. –