2011-08-14 3 views
1
var main = { 
    doSomething: function(){ 
     function firstOne(){} 
     function secondOne(){ 
     $.ajax({ 
      success: function(){ 
       firstOne(); /* here I want the previous function */ 
      } 
     }); 
     } 
    } 
} 

표시된 줄에서 firstOne() 함수를 어떻게 실행합니까? 그것은 아마도 noobish 질문이지만, 나는 JS 네임 스페이스를 얻지 못한다 (그리고 나는 시도했다).jQ의 AJAX 요청 내부에서 로컬 함수를 실행하는 방법은 무엇입니까?

JS 우수 사례 관점에서 좋은 기능을 정의 할 수 있습니까?

+2

시도해 보셨습니까? 오류가 발생 했습니까? –

+0

표시된 줄에서'firstOne()'함수를 실행중인 것처럼 보입니다. –

+0

그건 이론적으로 작동합니다. 하지만 결코'secondOne'을 실행하지 않으므로 Ajax 요청은 결코 만들어지지 않습니다. –

답변

0

당신이하는 일. 이 MDN의 설명은 이유를 설명합니다.

함수 내에 함수를 중첩시킬 수 있습니다. 중첩 된 (내부) 함수는 포함 된 (외부) 함수에 대해 전용입니다. 또한 클로저를 형성합니다.

...

중첩 함수가 고정이기 때문에,이 중첩 기능이 포함 된 함수의 인수와 변수 "상속"할 수 있다는 것을 의미한다. 즉, 내부 함수에는 외부 함수의 범위가 포함됩니다.

는 요약하자면

내부 함수는 외부 함수 문에서 액세스 할 수있다.

내부 함수는 클로저를 형성합니다. 내부 함수는 외부 함수의 인수와 변수를 사용할 수 있지만 외부 함수는 내부 함수의 인수와 변수를 사용할 수 없습니다.

이렇게하면을 Ajax 콜백에서 호출 할 수있는 이유가 설명됩니다.

이것이 좋은 디자인인지 여부는 달성하려는 것에 완전히 의존합니다. firstOne이 코드의 여러 부분에서 재사용 할 수 있다면, 로컬 컨텍스트에서만 액세스 할 수있는 중첩 된 함수로 정의하는 것은 나쁜 결정입니다. 그러나 예를 들어 secondOne에서 두 개의 Ajax 호출이 모두 콜백에서 동일한 기능을 필요로하는 경우 로컬 중첩 함수에서이 기능을 래핑하는 것이 좋습니다. 한 번 그 행동을 필요로한다면 그것은 별도의 기능으로 선언하기에는 과잉 (과도한 타이핑) 일 수 있습니다.

0

코드가 정상적으로 실행되고 정상적으로 실행되어야합니다.

다른 많은 프로그래밍 언어와 달리 Javascript에는 범위 조회 체인이 있습니다. 함수 또는 변수가 로컬 범위에서 발견되지 않으면 Javascript는 위의 범위에서 함수 또는 변수를 찾습니다. 거기도 발견되지 않으면 머리 객체 (브라우저에서 window 객체)에 도달 할 때까지 체인에서 더 멀리 찾을 것입니다. 거기에 없다면 오류가 발생합니다.

firstOne() 함수가 AJAX 객체 바로 위의 범위에서 선언되었으므로 Javascript가 문제를 찾을 필요가 없습니다. 상위 범위를 수동으로 참조 할 필요가 없습니다.

관련 문제