목적 closures
은 단순히 상태 를 보존하는 것 입니다. 따라서 이름 closure
- 상태 가 닫힙니다 . 자세한 설명을 쉽게하기 위해 Javascript를 사용하겠습니다.
일반적으로 기능이 있습니다
function sayHello(){
var txt="Hello";
return txt;
}
여기서 변수의 범위는이 함수에 바인딩됩니다. 따라서 실행 후 변수 txt
가 범위를 벗어납니다. 함수 실행이 완료된 후에는 액세스하거나 사용할 수 없습니다.
클로저는 언어 구성으로, 앞서 말했듯이 변수의 상태를 보존하고 범위를 연장 할 수 있습니다.
다른 경우에 유용 할 수 있습니다. 하나의 유스 케이스는 고차 함수 의 구성입니다 .
수학 및 컴퓨터 과학에서 고차 함수 (기능적 형태, 함수 또는 펑터)는 다음 중 하나 이상을 수행하는 함수입니다. 1
- 하나 이상의 기능을 입력으로 사용
- 함수를 출력
간단하지만 분명히 너무 유용한 예는 다음과 같습니다.
makeadder=function(a){
return function(b){
return a+b;
}
}
add5=makeadder(5);
console.log(add5(10));
당신은 함수 정의 makedadder
입력으로 하나 개의 매개 변수를 사용하고 반환, 기능 . 이 외부 기능 function(a){}
과 내부 function(b){}{}
사용자가 정의 허점 (묵시적으로) 다른 함수 add5
높은 순서 연료 소모량을 호출 한 결과로는 makeadder
. makeadder(5)
익명 ( inner ) 함수를 반환합니다.이 함수는 1 개의 매개 변수를 사용하고 외부 함수의 매개 변수와 내부 함수 의 매개 변수의 합을 반환합니다 .
트릭 복귀하면서 있다는 것이다 내부 첨가 실제 않는 기능, 외부 함수의 매개 변수의 범위는 ( a
) 보존된다. 매개 변수 는 add5
기억합니다 .a
5
또는 하나 이상의 유용한 예를 보여주기 위해 :
makeTag=function(openTag, closeTag){
return function(content){
return openTag +content +closeTag;
}
}
table=makeTag("<table>","</table>")
tr=makeTag("<tr>", "</tr>");
td=makeTag("<td>","</td>");
console.log(table(tr(td("I am a Row"))));
또 다른 일반적인 사용 사례는 소위 IIFE = 즉시 호출 된 함수 표현식입니다. 자바 스크립트에서 개인 멤버 변수 를 가짜 로 만드는 것은 매우 일반적입니다 . 이것은 정의가 호출 된 직후에 private scope = 생성하는 함수를 통해 수행 closure
됩니다. 구조는 function(){}()
입니다. ()
정의 후 괄호 를 확인하십시오. 이를 통해 모듈 패턴 을 드러내는 객체 생성에 사용할 수 있습니다. 트릭은 범위를 만들고 IIFE를 실행 한 후이 범위에 액세스 할 수있는 개체를 반환하는 것입니다.
Addi의 예는 다음과 같습니다.
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
반환 된 객체에는 함수 (예 :)에 대한 참조가 있으며 publicSetName
, "private"변수에 액세스 할 수 있습니다 privateVar
.
그러나 이것들은 Javascript의 더 특별한 사용 사례입니다.
클로저가 가장 잘 수행 할 수있는 프로그래머가 수행해야 할 특정 작업은 무엇입니까?
몇 가지 이유가 있습니다. 그가 기능적 패러다임 을 따르기 때문에 자연 스러울 수도 있습니다 . 또는 Javascript에서 : 언어의 단점을 피하기 위해 클로저에 의존 하는 것은 단지 필요한 것입니다 .