폐쇄 란 무엇입니까?
먼저 코드를 살펴 보겠습니다.
함수 a () {var n = 0; 함수 Inc () {n ++; Console.log (N); } inc (); Inc (); }에이(); // 콘솔 출력 1, 그런 다음 출력 2간단합니다. 다른 코드를 살펴 보겠습니다.
함수 a () {var n = 0; this.inc = function () {n ++; Console.log (N); };} var c = new a (); c.inc (); // 콘솔 출력 1c.inc (); // 콘솔 출력 2간단합니다.
폐쇄 란 무엇입니까? 이것은 폐쇄입니다!
다른 함수의 범위 내에서 변수에 액세스 할 수있는 함수는 클로저입니다. 여기서 Inc 함수는 생성자 A의 변수 n에 액세스하므로 폐쇄가 형성됩니다.
다른 코드를 살펴 보겠습니다.
함수 a () {var n = 0; 함수 Inc () {n ++; Console.log (N); } return inc;} var c = a (); c (); // 콘솔 출력 1c (); // 콘솔 출력 2그것이 어떻게 실행되는지 봅시다 :
var c = coUter (),이 문장 couter ()는 함수 inc를 반환 한 다음이 문장은 var c = in과 동일합니다.
C (),이 문장은 inc ()와 같습니다. 함수 이름은 단지 식별자 (함수에 대한 포인터)이고 ()는 실행 함수 입니다 .
다음 세 문장은 다음으로 번역되었습니다 : var c = inc; Inc (); inc ();, 그것과 첫 번째 코드 사이에 차이가 있습니까? 아니요.
폐쇄 란 무엇입니까? 이것은 폐쇄입니다!
모든 교과서 자습서는 마지막 단락을 사용하여 클로저를 설명하는 것을 좋아하지만 이것이 문제를 복잡하게 생각합니다. 여기서 반환되는 것은 기능 이름입니다. Tan Haoqiang의 C/C ++ 프로그래밍을 본 적이없는 학생들은 ()를 가져 오는 것의 차이를 즉시 반영하지 않을 수 있습니다. 즉,이 글쓰기 방법에는 트랩이 제공됩니다. 이 글쓰기 방법은 더 두드러 지지만 여전히 문제를 단수화하고 코드 1과 코드 2를보고 싶습니다. 기능의 호출에 대해 혼란스러워지면 n의 가치에 대해 혼란 스러울 것입니까?
왜 이렇게 써야합니까?
우리는 JS의 각 기능이 작은 검은 방이라는 것을 알고 있습니다. 외부 정보를 얻을 수 있지만 외부 세계는 내부의 내용을 직접 볼 수 없습니다. INC 함수를 제외하고 변수 n을 작은 어두운 방에 넣으면 변수 n과 연락 할 수있는 다른 방법은 없습니다. 또한 함수 A 외부에서 동일한 이름으로 변수 n을 정의해도 서로 영향을 미치지 않습니다. 이것은 "캡슐화"의 소위 향상입니다.
INC를 식별하기 위해 리턴으로 리턴 함수를 사용해야하는 이유는 Inc 함수가 A 함수 외부에서 직접 호출 될 수 없기 때문에 Return Inc는 외부와 연관되어 있기 때문입니다. 코드 2에서는 Inc를 외부와 연관시킵니다.
일반적인 트랩
이것을 확인하십시오 :
함수 createUlections () {var result = new array (); for (var i = 0; i <10; i ++) {result [i] = function () {return i; }; } return result;} var funcs = createUlections (); for (var i = 0; i <funcs.length; i ++) {console.log (funcs [i] ());}언뜻보기에, 나는 그것이 0 ~ 9를 출력한다고 생각했지만 10 10을 출력 할 것으로 기대하지 않았습니까?
여기서 함정은 다음과 같습니다. ()가있는 함수는 실행 함수입니다! 간단한 문장 var f = function () {alert ( 'hi'); }; 팝업되지 않고 다음 문장 F (); 함수 내부에서 코드가 실행됩니다. 위의 코드는 다음과 같이 번역됩니다.
var result = new array (), i; result [0] = function () {return i; }; // 함수가 실행되지 않고 함수는 변경되지 않으며 함수의 i를 대체 할 수 없습니다! 결과 [1] = function () {return i; }; // 함수가 실행되지 않고 함수는 변경되지 않으며 함수의 i를 대체 할 수 없습니다! ... 결과 [9] = function () {return i; }; // 함수가 실행되지 않고 함수는 변경되지 않으며 함수의 i를 대체 할 수 없습니다! i = 10; funcs = result; result = null; console.log (i); // funcs [0] ()는 반환 i 명령문을 실행하는 것입니다. // funcs [1] ()는 반환 i 명령문을 실행하는 것입니다. // funcs [9] ()는 반환 i 명령문을 실행하는 것입니다.왜 쓰레기 수집 결과 만 있지만 나는 그렇지 않습니까? 나는 여전히 기능으로 참조되고 있기 때문입니다. 그것은 판이 항상 제한된 식당과 같기 때문에 웨이터는 빈 접시를 재활용하기 위해 대만 순찰 대만에 가서 야채를 포함하는 접시를 어떻게 모으는가? 물론, 접시에 접시 (= null)를 수동으로 붓는 경우 접시가 제거됩니다. 이것은 소위 메모리 재활용 메커니즘입니다.
실제로 내가 여전히 보유 할 수있는 방법에 관해서는, 실제로 기사의 시작부터 모든 것을 읽는 것은 걱정할 필요가 없어야합니다. 한 조각을 잃기 위해 접시에 접시 한 조각을 먹을 필요가 없습니까?
요약합시다
클로저는 함수가 다른 함수를 나타내는 변수입니다. 변수가 참조되므로 재활용되지 않으므로 개인 변수를 캡슐화하는 데 사용할 수 있습니다. 이것은 유리하고 단점입니다. 불필요한 폐쇄는 메모리 소비 만 증가시킬 것입니다! 또한 폐쇄를 사용할 때는 변수의 값이 요구 사항을 충족하는지 여부에주의를 기울여야합니다. 이는 정적 개인 변수와 유사하기 때문입니다. 클로저는 일반적으로 많은 것들과 혼합되며, 더 많은 이해로 접촉 한 후에 만 우리는 이해를 심화시킬 수 있습니다. 여기서 우리는 단지 기본적인 것들에 대해 이야기하고 있습니다.
이 기사에 대한 링크 : http://www.cnblogs.com/qieguo/p/5457040.html
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.