2013-03-24 5 views
0

필자는 내부 참조에서이 참조를 컴파일러가 해결하는 방법에 관심이 있습니다. 우리가이 코드를 가지고 말 :JavaScript가이 참조를 어떻게 해결합니까?

function makeConsumer(run_priority,run_object) { 
     var consumer = function(last_run_action) { 
       if(!!last_run_action) { 
         // do something 
       } else { 
         var next_to_load = run_priority.shift(); 
         next_to_load.consume = consumer; 
         run_load_script(next_to_load,run_object); 
       } 
     }; 
     return consumer; 
} 

가 상단에 consumer에 대한 참조이며, 함수가 정의되고 완료하기 전에 다음, consumer 또 다른 참조가 최종 else 블록에서 발생합니다. 원래 소비자가 코드가 실행되는 시점에 할당되지 않은 경우에도 소비자에 대한이 참조는 어떻게 유효합니까? 나는 함수가 범위를 맨 위로 밀어 넣는다는 것을 이해하지만 변수에 할당 된 함수 표현식에 대해서도 마찬가지입니까?

함수가 할당 된 변수를 통해 자체 참조하고 해당 참조가 아직 유효하지 않은 시나리오를 만들 수 있습니까? javacript가 consumer에 대한 두 번째 참조를 작성하는 방법은 해당 참조가 아직 정의되지 않은 함수의 일부일 때 함수를 참조합니까?

이것은 재귀에 사용되는 참조와 동일합니까? 그리고 만약 그렇다면, 어떻게 그들은 컴파일러에 의해 평가되는 유효합니까?

답변

1

자바 스크립트 변수 선언이 맨 위로 올라갑니다. 따라서 이러한 변수는 모두 어디에서나 참조되기 전에 "존재"합니다. 그래서 예는 다음과 동일합니다 :

function makeConsumer(run_priority,run_object) { 
     var consumer; 
     consumer= function(last_run_action) { 
       var next_to_load; 
       if(!!last_run_action) { 
         // do something 
       } else { 
         next_to_load = run_priority.shift(); 
         next_to_load.consume = consumer; 
         run_load_script(next_to_load,run_object); 
       } 
     }; 
     return consumer; 
} 

소비자가 함수 정의에서 참조 때, 변수가 이미 선언 된

in this question. 리프팅에 대한이있다.

변수는 함수가 실행될 때까지 평가되지 않습니다. 따라서이 경우 함수는 실제로 함수가 실행될 때까지 소비자가 무엇인지 알 필요가 없습니다 (이 예에서는 표시되지 않음).

관련 문제