두 번째 예제는 함수를 반환 한 함수 내에서 변수에 대한 링크를 유지하는 함수 객체를 명시 적으로 반환하지만, 첫 번째 예제에서는 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
당신이 볼 수 있듯이, 스택 프레임이 후 해제되지 않은 함수가 반환되었습니다. 변수는 살아 있고, 적절한 인터페이스를 통해 재생할 수 있습니다.
첫 번째의 예는 내부 함수 그 외측 영역에 대한 액세스를 수행하고, 는 외부 기능/범위/폐쇄에서 선언 된 변수에 기초하여 값을 복귀한다. 그러나 함수 또는 모듈이 반환되지 않았기 때문에 함수에 로컬 인 변수는 일단 (외부) 함수가 반환되면 할당 해제됩니다. 따라서 내부 함수가 외부 범위와 함께 클로저를 형성하지만 실제로는 함수로 사용되지 않습니다. 종결이 무엇인지에 대한 생산적인 예.
중첩 된 함수가 클로저를 작성하는지 여부에 대해 많은 논의가있었습니다 * befroe * 외부 함수가 종료되었습니다. 내부 함수는 단순히 스코프 체인에 외부 함수를 가지고 있으며 그 시점에는 클로저가 없다고 주장 할 수 있습니다. 내부 함수가 변수에 할당되고 외부 함수가 실행을 완료 한 후에 호출 가능하거나 액세스 할 수있는 경우에는 클로저가 있습니다. 일부는 또한 할당 된 함수가 실제로 해당 범위 체인에서 "닫힌 변수"를 사용하는 경우에만 클로저가 형성된다고 생각합니다. – RobG