먼저 코드:
//函数a function a() { var i=0; //函数b function b() { alert(++i); } return b; } //函数c var c = a(); c();
코드 기능:
1. 함수 b는 함수 a 안에 중첩되어 있습니다.
2. 함수 a는 함수 b를 반환합니다.
코드에 있는 함수 a의 내부 함수 b가 함수 a 외부의 변수 c에 의해 참조되는 경우 이를 클로저 생성이라고 합니다. 때로는 함수 b가 익명 함수, 즉 return function(){};
장점: 1. 함수 내 변수의 보안을 보호하고 캡슐화를 강화합니다. 2. 변수를 메모리에 유지합니다. (너무 많이 사용하면 단점이 되고 메모리를 차지하게 됩니다.)
클로저가 리소스를 차지하는 이유는 함수 a가 종료될 때 변수 i가 소멸되지 않는다는 것입니다. 왜냐하면 함수 a가 종료되기 때문입니다. 왜냐하면 b의 실행은 a의 변수에 따라 달라지기 때문입니다.
시나리오에 적합하지 않음: 클로저를 반환하는 함수는 매우 큰 함수입니다
일반적인 폐쇄 프레임워크는 jquery입니다.
클로저는 JavaScript 언어의 주요 기능입니다. 클로저의 주요 용도는 비공개 메서드와 변수를 설계하는 것입니다.
이는 프레임워크를 만들 때 더욱 분명해집니다. 일부 메서드와 속성은 작업 논리 프로세스에서만 사용되므로 이러한 속성의 외부 수정을 허용하지 않으므로 메서드 액세스만 제공하도록 클로저를 설계할 수 있습니다.
클로저의 단점은 메모리에 상주하므로 메모리 사용량이 증가한다는 것입니다. 부적절한 사용으로 인해 메모리 누수가 쉽게 발생할 수 있습니다.
요약:
장점:
1. 논리적 연속성. 클로저를 다른 함수 호출의 매개변수로 사용하면 현재 로직에서 벗어나 추가 로직을 별도로 작성하는 것을 방지할 수 있습니다.
2. 컨텍스트의 지역 변수 호출을 촉진합니다.
3. 캡슐화를 강화하면 2번 항목을 확장하면 변수를 보호할 수 있습니다.
단점:
클로저는 메모리 낭비라는 매우 심각한 문제를 가지고 있습니다. 이러한 메모리 낭비는 메모리에 상주하기 때문일 뿐만 아니라, 더 중요한 것은 클로저를 잘못 사용하면 잘못된 메모리가 생성된다는 것입니다. :
var array = []; function abc() { var foo = function(){ } array.push(foo); return foo; } for(var i = 0 ; i < 10000; i ++) { abc(); } alert(array[0] == array[1]);
위의 테스트를 통해 abc()를 1만 번 실행하여 생성된 동일한 논리적 클로저의 주소가 동일하지 않음을 알 수 있습니다. 즉, 동일한 Function 객체가 잔뜩 생성되므로 장점은 팩토리 모드를 사용하여 사용할 함수를 생성할 수 있다는 것입니다. 그러나 실수로 클로저를 일반 논리로 사용하면 필연적으로 메모리 가비지가 발생합니다. 구문을 변경하면 이해하기 더 쉬울 수 있습니다.
var foo = new Function();
따라서 클로저에 관해 내 습관에 관한 한 나는 가능하면 사용하지 않습니다. 꼭 사용해야 한다면 클로저 객체의 수를 적게 또는 고유하게 유지하는 방법을 찾으세요.
위 내용은 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다.