2013-04-12 7 views
0

업데이트 : 원래 질문에 잘못된 가정이 있었기 때문에 질문을 다시 작성합니다. (이미 정의되지 않은 변수를 초기화 한 콘솔에서 코드를 실행했습니다.)JavaScript : 객체 초기화 후 내부 변수 초기화

이 만드는 의미 :

var obj = { 'whichScope': a }; 
obj.whichScope; //"ReferenceError: a is not defined" 

하지만 오류가 발생하지 않습니다이 다음 예제 오는 방법? 그리고 두 번째 라인이 첫 번째 라인 이전에 실행되면 왜 obj가되지 않습니다. 어떤 스코프가 "After"로 해결됩니까?

obj가 초기화되기 전에 앞의 예제에서 "var a"가 실행되면 'a = "다음에"; " obj가 초기화되기 전에 실행 되나요?

var a = "Before"; 
var obj = { 'whichScope': a }; 
a = "After"; 
obj.whichScope; //"Before" 

whichScope이 'a'를 반환하는 함수를 참조하는 경우 마지막 예제에서 'After'로 변환됩니다.

답변

1

이를 가변 호이 스팅이라고합니다.

참고 : (var 선언)

변수와 함수는 그 범위의 상단에 게양된다.

그래서 기술적으로, 당신의 스크립트는 다음과 같다 :

var a; // = undefined 
var obj = { 'whichScope': a }; 
a = "After"; 

첫 번째 예를 들어 당신이 무슨 말을하지 않지만. obj.whichScope 값은 예상대로 undefined입니다.

DEMO : 마지막 문으로 http://jsfiddle.net/pRQwK/

, If whichScope refers to a function that returns 'a' then it does resolve to "After" in the second example.-a의 값이 (폐쇄에 의해) 포착되지 않기 때문에 즉. 속성을 설정할 때 값은 즉시 캡처됩니다 (클로저와 관련 없음).