2010-04-30 6 views
2

이 아마 덩어리 질문이지만,이 작품 왜 이해가 안 :자바 스크립트 구문 분석/평가 순서?

<script type="text/javascript"> 
    alert(foo); 
    function foo() { } 
</script> 

이 경고 "함수 foo를 (} {)",하지만 난 경고를 기대는 함수 foo 전에 평가했다 한정된. 누군가가 구문 분석/평가 순서에 대해 이해하지 못하는 것을 설명 할 수 있습니까?

답변

3

PHP와 마찬가지로 JavaScript는 코드가 실행되기 전에 최상위 수준 인 function 선언을 추적합니다. 그러나 사용하는 할당하여 자동 기능을 우회 할 수있다 :

var a = function a() { }

+3

참고로, 심각한 버그 [http://groups.google.com/group/comp.lang.javascript/msg/5b508b03b004bce8]로 인해 함수가 여전히 IE에서 'var'선언 이전에 호이스트됩니다. 함수식이 명명 되었기 때문에 모든 JScript 버전에 있어야합니다. – CMS

+0

@CMS 흥미로운 작은 쪽지. IE의 모든 버전에 영향을 줍니까? – alex

+0

@alex, 예 ** IE 9 플랫폼 미리보기를 포함한 IE의 모든 ** 버전! (나는 정말로 실망했다.) 그 버그는 그것보다 더 나쁘다. 'var foo = function bar() {}; 경고 (foo === bar); // false! ' – CMS

0

기능 선언은 상단에 게양, 따라서 무엇보다도 선언됩니다.

당신이 익명 함수에 변수 a를 할당 그래서

var a = function() { 
    // do it 
}; 

같은 변수에 할당하여이 동작을 변경할 수 있습니다.