2011-08-03 4 views
3

내부 (개인) 기능과 클로저의 차이점을 매우 비슷하게 보일 수 있습니까?내부 (개인) 기능 및 클로저

내부 기능 : 클로저가 정상 범위 과거 로컬 변수의 수명을 지속하면서

function a(param) { 
    function b(theinput) { 
     return theinput * 2; 
    }; 
    return 'The result is ' + b(param); 
}; 

폐쇄

function f() { 
    var b = "b"; 
    return function() { 
     return b; 
    } 
} 

답변

4

두 번째 예제는 함수를 반환 한 함수 내에서 변수에 대한 링크를 유지하는 함수 객체를 명시 적으로 반환하지만, 첫 번째 예제에서는 private 함수를 호출 한 결과를 반환합니다. 따라서 두 번째 예제는 클로저입니다.

여기에 더 나은 클로저를 보여줍니다 두 번째 예제의 약간 수정 된 버전입니다 :

function f(){ 
    var a = "foo"; 

    // return an object containing two methods 
    // which can access and modify the private "a" 
    // variable even after the function has returned 
    return { 
     showA: function() { 
      alert(a); 
     }, 
     changeA: function(str) { 
      a = str; 
     } 
    } 
} 

var fun = f(); 
fun.showA(); // "foo" 
fun.changeA("blahblah"); 
fun.showA(); // "blahblah" 

바이올린 : 그래서 http://jsfiddle.net/MKD6p/1

당신이 볼 수 있듯이, 스택 프레임이 후 해제되지 않은 함수가 반환되었습니다. 변수는 살아 있고, 적절한 인터페이스를 통해 재생할 수 있습니다.

첫 번째의 예는 내부 함수 그 외측 영역에 대한 액세스를 수행하고, 는 외부 기능/범위/폐쇄에서 선언 된 변수에 기초하여 값을 복귀한다. 그러나 함수 또는 모듈이 반환되지 않았기 때문에 함수에 로컬 인 변수는 일단 (외부) 함수가 반환되면 할당 해제됩니다. 따라서 내부 함수가 외부 범위와 함께 클로저를 형성하지만 실제로는 함수로 사용되지 않습니다. 종결이 무엇인지에 대한 생산적인 예.

2

MDN는 말한다 : 당신은 함수 내 둥지 기능을 할 수

. 중첩 된 (내부) 함수는 포함 된 (외부) 함수에 대해 전용입니다. 또한 클로저를 형성합니다.

클로저는 자유 변수와 해당 변수를 바인딩하는 환경 (표현식을 "닫음")을 함께 가질 수있는 표현식 (일반적으로 함수)입니다.

중첩 함수는 클로저이므로 중첩 함수는 포함 함수의 인수와 변수를 "상속"할 수 있습니다. 즉, 내부 함수에는 외부 함수의 범위가 포함됩니다.

는 요약하자면

내부 함수는 외부 함수 문에서 액세스 할 수있다.

내부 함수는 클로저를 형성합니다. 내부 함수는 외부 함수의 인수와 변수를 사용할 수 있지만 외부 함수는 내부 함수의 인수와 변수를 사용할 수 없습니다.

+0

중첩 된 함수가 클로저를 작성하는지 여부에 대해 많은 논의가있었습니다 * befroe * 외부 함수가 종료되었습니다. 내부 함수는 단순히 스코프 체인에 외부 함수를 가지고 있으며 그 시점에는 클로저가 없다고 주장 할 수 있습니다. 내부 함수가 변수에 할당되고 외부 함수가 실행을 완료 한 후에 호출 가능하거나 액세스 할 수있는 경우에는 클로저가 있습니다. 일부는 또한 할당 된 함수가 실제로 해당 범위 체인에서 "닫힌 변수"를 사용하는 경우에만 클로저가 형성된다고 생각합니다. – RobG

2

두 기능 모두 매우 유사합니다. 내부/개인 기능은 가시성이 제한된 기능입니다. 클로저는 주변 범위를 캡처하는 함수입니다. function() {} 구조는 단지 전역 객체를 참조합니다 익명 함수, window을 만들어

function example() { 
    var window = { 'location': null }; 
    var maybeARedirect = function() { 
     window.location = "http://google.com"; 
    } 
    maybeARedirect(); 
} 

경우이 구글에 사용자를 리디렉션 것 : 여기에 코드 샘플을 설명하기 위해입니다. 그러나 클로저를 생성하기 때문에 로컬 변수 window 개체에 변수를 설정하면 아무 효과가 없습니다.

익명 기능이있는 대부분의 언어에서 최소한 폐쇄 기능을 수행 할 수 있습니다.