2014-12-04 2 views
0
var foo = 'outer'; 
function outer() { 
    var foo = 'closure'; 
    var bar = 'baz'; 
    return function inner() { 
     console.log(foo); 
    } 
} 

inner()에 필요하기 때문에 foo이 폐쇄됨을 이해합니다.Javascript : 모든 변수에 대해 클로저가 작성 되었습니까? 아니면 내부 함수가 사용할 수있는 클로저에 대해서만 클로저가 작성 되었습니까?

bar도 폐쇄 될 예정입니까? inner()의 범위에 있지만 inner()에 의해 사용되고 있지 않습니다.

답변

1

이론적으로, 전체 상위 범위는 변수 foobar 및 상위 범위에 대한 참조를 포함하여, 이상 종료되어 inner이 필요할 수있는 기능. 적어도 그것은 그것이 specced되는 방법이다. 실제로 엔진은 이것을 최적화하고 참조되지 않은 모든 것을 가비지 수집합니다 (예 : V8 does this).

+0

그냥 부모 범위로 보입니다. "내부 선언문의 범위에있는 모든 변수는 클로저에서 사용할 수 있습니다"(JavaScript Ninja –

+1

@ AdamZerner의 비밀을 인용하여 말합니다. 범위 체인이 있으며 각각에는 상위 범위에 대한 참조가 있습니다. 클로저 범위는 그 안에 정의 된 모든 함수들 사이에서 공유 될 수 있습니다. "* 범위 내의 모든 변수 *"는 현재 범위 변수 및 거기에서 액세스 할 수있는 다른 모든 변수를 나타냅니다. – Bergi

1

특정 변수 만 이월 될 수 없습니다. 전체 범위은 클로저가 만들어 질 때 이월됩니다. 이 경우 foobar이며 해당 범위에있는 변수는 inner 함수에서 사용할 수 있습니다.

+0

감사합니다. 그렇다면 앞으로 진행되는 직접적인 부모 범위일까요? 아니면 모든 부모 범위입니까? 그리고 다른 언어가 이것을 다르게 구현합니까? 필요한 부분 만 필요할 때 전체 범위를 앞으로 지나치게 지나치게 보인다. –

+1

@AdamZerner 내부 함수에서 사용하고있는 변수의 범위는 전달됩니다. –

+0

아 좋아요. 그래서'foo'는'inner'에서 사용되고'foo'의 범위는'outer'이므로'inner'에서'outer'가 이월됩니다? –

관련 문제