2014-04-16 4 views
0

이 코드가 작동하는 이유는 무엇입니까? - http://jsfiddle.net/Mq9Ap/1/이 함수가 호출되는 이유는 무엇입니까?

$(function() { 

    function outer() { 
     var counter = 0; 
     function inner() { 
      alert(counter); 
      counter++; 
     } 
     return inner; 
    } 

    var x = outer(); // As we're calling outer here, x is a reference to inner 
    x(); // alerts 0 
    x(); // alerts 1 

}); 

그러나 return inner 편집

return inner()에 내가 변경 한 경우에만 한 번 실행 : 내가 괄호를 언급하여 내 질문의 의도를 혼동 한

. x()가 외부 함수를 가리키는 것처럼 내부 함수가 모두 호출되는 방법은 여전히 ​​혼란 스럽습니다.

반환 값이 함수에 대한 포인터 인 경우 컴파일러에서 함수를 호출해야한다는 것을 알고 있습니까?

답변

0

나는 그것을 깨뜨 렸습니다. 내 혼란이 return inner; 너무 많은 아니었다 그러나 그것은이었다

var x = outer(); 

지금은 그 x가 있기 때문에 b에 함수 참조 인() 호출의 외부의 반환 값을 보유하고 이해하고, 우리가 지금 추가 그래서 만약 이 반환 값 주위에 another()를 호출하면 outer()()와 비슷한 해당 내부 함수를 호출합니다.

function outer() { 
    var counter = 0; 
    function inner() { 
     console.log(counter); 
     counter++; 
    } 
    return inner; 
} 

outer()(); 
outer()(); 
outer()(); 

//output 
0 
0 
0 

var x = outer(); 
x(); 
x(); 
x(); 

//output 
0 
1 
2 

외부가 outer() 호출 된 var x 작품 때문에 마지막 섹션. 매번 내부가 x();으로 호출되면 카운터는 스택에 이미 있으므로 내부 함수는이를 정적 var ...으로 간주합니다.

혼란 물건이 자바 스크립트 :(

편집 :

또 다른 유레카 순간 - 내가 처음 outer()가 호출 될 때마다, 그것은 새로운 기능 컨텍스트를 생성하고 var counter이기 때문에 outer()(); 작동하지 않는 것을 깨달았다 매번 스택에서 초기화되고 두 번째 호출이 호출되면 카운터는 항상 0으로 설정됩니다.

x = outer();은 함수 컨텍스트가에 저장되므로 이전 함수 호출에서 카운터 값을 유지합니다.및 var counter은 초기화되지 않으므로 초기화되지 않습니다.

2

return inner은 내부 기능을 반환합니다. 이것을 호출 할 수 있습니다.

return inner()은 즉시 내부 함수 (경고 0)를 실행 한 다음 반환 값 (정의되지 않음)을 반환합니다. 그런 다음 undefined이 기능이 아님 (x()이 전화를 걸 때) 오류가 발생합니다.

+0

답변 해 주셔서 감사합니다. 나는 내 자신의 질문에 대답하려고 할 때 내 논리를 확인하는 것을 느낄 수 있는지 친절하게 물어볼지도 모른다 https://stackoverflow.com/a/23122932/1837472. 나는 귀하의 의견을 감사드립니다. – Data

+0

예, 귀하의 논리에 대한 권리입니다. –

0

return inner();을 수행하면 실제로는 inner을 호출하고 반환 값을 반환합니다. 반환 값은 실제로 반환되지 않으므로 undefined입니다. undefined이 함수가 아니기 때문에 (이 경우 을 호출하여 호출하려고 시도하기 때문에) 오류가 발생합니다.

return inner;을 수행하면 실제로 내부 함수에 대한 참조가 반환됩니다.

0

귀하가 반환하는 사실입니다.

return inner(); 실제로 내부 함수를 호출하고 결과를 가져옵니다. 그 결과가 반환됩니다. inner 함수는 아무 것도 명시 적으로 반환하지 않으므로 기본적으로 undefined을 반환합니다. 지금 x은 정의되지 않았습니다. 정의되지 않은 전화 번호는 x입니다.

return inner;은 실제로 내부 함수에 대한 참조를 반환합니다. 자 이제 x은 함수를 참조합니다. 실제로 inner 클로저 기능을 호출 할 x()을 실행할 수 있습니다.

+0

나는 당신의 코멘트의 마지막 비트까지 아직도 혼란 스러웠다. 컴파일러가 return 문에 도달 할 때 다른 함수를 가리키는 포인터 인 경우 자동으로 변수를 호출해야한다는 것을 알고 있습니까? – Data

+0

내 대답이 업데이트되었습니다. 함수 참조를 반환하면 호출되지 않습니다. –

관련 문제