JavaScript에서 가장 중요한 기능 중 하나는 클로저 사용입니다. 폐쇄를 사용하기 때문에 현재 범위는 항상 외부 스코프에 액세스 할 수 있습니다. JavaScript에는 블록 레벨 범위가없고 기능 범위 만 있으므로 클로저 사용은 함수와 밀접한 관련이 있습니다.
개인 변수를 시뮬레이션합니다
코드 사본은 다음과 같습니다.
기능 카운터 (시작) {
var count = start;
반품 {
증분 : function () {
카운트 ++;
},
get : function () {
반환 수;
}
}
}
var foo = 카운터 (4);
foo.increment ();
foo.get (); // 5
여기서 카운터는 기능 증분 및 get의 두 개의 폐쇄를 반환합니다. 이 두 기능은 카운터 범위에 대한 액세스를 유지하므로 카운트 범위에 정의 된 가변 수에 액세스 할 수 있습니다.
개인 변수의 작동 메커니즘
JavaScript는 스코프에 대한 값과 참조를 할당 할 수 없으므로 위의 예에서는 외부에서 내부 개인 변수 수에 직접 액세스 할 수있는 방법이 없습니다. 유일한 방법은 폐쇄를 정의하여 액세스하는 것입니다.
코드 사본은 다음과 같습니다.
var foo = 새로운 카운터 (4);
foo.hack = function () {
카운트 = 1337;
};
위의 코드는 해킹이 카운터 내에서 정의되지 않기 때문에 카운터 범위 내에서 카운트 변수의 값을 변경하지 않습니다. 위의 코드는 글로벌 변수 수를 생성하거나 덮어 씁니다.
루프의 폐쇄
가장 쉬운 실수 중 하나는 루프 내에서 클로저를 사용하는 것입니다.
코드 사본은 다음과 같습니다.
for (var i = 0; i <10; i ++) {
settimeout (function () {
Console.log (i);
}, 1000);
}
위의 코드는 0 ~ 9를 출력하지 않지만 연속적으로 10 번 출력합니다.
위의 익명 성은 변수 i에 대한 참조를 유지합니다. Console.log 함수가 출력을 시작하도록 호출되면, 이것은 종료 된 루프이고 변수 i는 이미 10입니다.
위의 오류를 피하려면 루프 할 때마다 값의 변수 사본을 작성해야합니다.
견적 오류를 피하십시오
루프에서 변수의 값을 복사하려면 가장 좋은 방법은 외부 레이어에 익명 함수를 추가하고 즉시 실행하는 것입니다.
코드 사본은 다음과 같습니다.
for (var i = 0; i <10; i ++) {
(기능 (e) {
settimeout (function () {
Console.log (e);
}, 1000);
})(나);
}
이 외부 익명 함수는 루프 변수 i를 첫 번째 매개 변수로 취하고 그 값을 자체 매개 변수 e에 복사합니다.
외부 익명 함수는 매개 변수 e를 settimeout으로 전달하므로 Settimeout은 매개 변수 e를 참조합니다. 또한,이 매개 변수 E의 값은 외부 루프 변경으로 인해 변경되지 않습니다.
Settimeout의 익명 함수에서 익명 기능을 반환하는 것과 동일한 효과를 달성하는 또 다른 방법이 있습니다.
코드 사본은 다음과 같습니다.
for (var i = 0; i <10; i ++) {
settimeout ((함수 (e) {
return function () {
Console.log (e);
}
}) (i), 1000)
}
또한 결합 방법을 통해 달성 할 수도 있습니다.
코드 사본은 다음과 같습니다.
for (var i = 0; i <10; i ++) {
settimeout (console.log.bind (Console, I), 1000);
}
기사가 끝나면 다음과 같이 요약하겠습니다.
(1) 폐쇄는 설계 원칙입니다. 컨텍스트를 분석하여 사용자 호출을 단순화하여 사용자가 자신의 목적을 알지 못하고 자신의 목적을 달성 할 수 있도록합니다.
(2) 폐쇄 분석에 관한 주류 온라인 기사는 실제로 폐쇄 원칙과 상반됩니다. 잘 사용할 수있는 클로저의 세부 사항을 알아야한다면,이 클로저는 설계 실패입니다.
(3) 가능한 한 적게 배우십시오.