2011-12-23 3 views
0

그들 사이의 차이점은 무엇입니까?
①function의 범위 -> ② [범위] ----> ③scope자바 스크립트 범위 체인 정보

var scope = 'window'; 
var someFunction = function(){ 
    something go here.... 
} 

된 SomeFuncion의 범위
된 SomeFuncion [범위]
윈도우 범위
가 맞아?

+2

질문을 명확하게하십시오. 네가 무엇을 요구하는지 모르겠다. Javascript의 변수는 함수의 지역 변수이거나 전역 변수입니다. 다른 가능성은 없습니다. –

+0

예제에서, 어휘 환경이라고 불리는 두 개의 "범위"가 있습니다 : (1) 함수의 범위, (2) 전역 범위. –

답변

4

범위 체인을 이해하려면 JavaScript Closures의 Richard Cornford의 기사, 특히 Identifier Resolution, Execution Contexts and scope chains의 부분을 읽어야합니다.

간단히 말해서 범위 체인은 전역 개체가 전역 실행 컨텍스트의 활성화/변수 개체이기 때문에 간단히 변수/활성화 개체에서 변수/활성화 개체로 이동하여 전역 개체로 중지합니다.

지금의 경우 :

var fred; 

function foo() { 
    alert(fred); 
} 

식별자 프레드는 (글로벌 코드의 경우에는 전역 오브제 자체) 전역 변수/활성화 오브젝트의 프로퍼티가된다. foo()이 호출되면 글로벌 개체를 포함하는 범위 체인으로 새로운 변수/활성화 개체가 만들어집니다. 식별자 fred은 내부 변수 개체에서 먼저 확인되고 거기에서 찾을 수 없으므로 체인의 다음 개체 (전역 개체)가 검색됩니다.

마찬가지로 위해 : foo는()가가 호출 될 때

function foo() { 
    function bar() { 
     alert(fred); 
    } 
    bar(); 
} 

그래서, 그 다음 바()를 호출하고, 지금 프레드는 첫째 줄의 변수 객체, 다음 푸의,에 대해 해결 전역 객체. 이 "문맥"오해의 소지가 의 값을 호출하는 이유

실행 컨텍스트을 이해하면, 당신은 또한 알게 될 것이다.

+1

변수/활성화 객체는 ES5 ... 및 환경의 [[Scope]]는 * 어휘 환경 * (owner 또는 * 환경 레코드 *)을 저장하므로 * 환경 레코드 *라고합니다. –

+0

감사합니다. ES5에 좀 더 깊이 들어가야합니다. 지금은 조금 게으르며 무시하고 있습니다. 그러나 나는 시간이 들러 붙을 것으로 생각한다. – RobG