클로저에 대한 영어 단어는 closure입니다. 이는 JavaScript 지식의 매우 중요한 부분입니다. 왜냐하면 클로저를 사용하면 코드의 양을 크게 줄이고 코드를 더 명확하게 보이게 하는 등의 작업을 할 수 있기 때문입니다. 한마디로 매우 강력합니다.
클로저의 의미: 직설적으로 말하면 클로저는 함수의 중첩입니다. 외부 함수가 실행되더라도 내부 함수는 외부 함수의 모든 변수를 사용할 수 있습니다(여기에는 JavaScript 범위 체인이 포함됩니다).
예제 1
function checkClosure(){ var str = 'rain-man'; setTimeout( function(){ alert(str); } //这是一个匿名函数 , 2000); } checkClosure();
이 예는 실행 프로세스를 주의 깊게 분석한 후에도 여전히 많은 지식 포인트가 있습니다. checkClosure 함수의 실행은 즉각적이며(아마도 0.00001밀리초만 소요될 수 있음) 함수에서 생성됩니다. checkClosure의 본문 변수 str을 얻었습니다. checkClosure가 실행된 후에는 str이 해제되지 않습니다. 이는 setTimeout의 익명 함수에 str에 대한 참조가 있기 때문입니다. 2초 후 함수 본문의 익명 함수가 실행되고 str이 해제됩니다.
예제 2, 코드 최적화
function forTimeout(x, y){ alert(x + y); } function delay(x , y , time){ setTimeout('forTimeout(' + x + ',' + y + ')' , time); } /** * 上面的delay函数十分难以阅读,也不容易编写,但如果使用闭包就可以让代码更加清晰 * function delay(x , y , time){ * setTimeout( * function(){ * forTimeout(x , y) * } * , time); * } */
익명 함수의 가장 큰 용도는 클로저(JavaScript 언어의 기능 중 하나)를 만드는 것이고, 네임스페이스를 구축하여 전역 변수의 사용을 줄일 수도 있습니다.
예제 3:
var oEvent = {}; (function(){ var addEvent = function(){ /*代码的实现省略了*/ }; function removeEvent(){} oEvent.addEvent = addEvent; oEvent.removeEvent = removeEvent; })();
예제 4:
var rainman = (function(x , y){ return x + y; })(2 , 3); /** * 也可以写成下面的形式,因为第一个括号只是帮助我们阅读,但是不推荐使用下面这种书写格式。 * var rainman = function(x , y){ * return x + y; * }(2 , 3); */
여기서 변수 rainman을 만들고 익명 함수를 직접 호출하여 5로 초기화합니다. 이 작은 트릭은 때때로 매우 실용적입니다.
예제 5:
var outer = null; (function(){ var one = 1; function inner (){ one += 1; alert(one); } outer = inner; })(); outer(); //2 outer(); //3 outer(); //4
이 코드의 변수 one은 (함수 내에서 정의되기 때문에) 지역 변수이므로 외부에서 접근할 수 없습니다. 하지만 여기서는 변수 1에 액세스할 수 있는 내부 함수를 만들었고 전역 변수 외부는 내부를 참조하므로 외부를 세 번 호출하면 증분 결과가 나타납니다.
참고: 클로저를 사용하면 내부 함수가 상위 함수의 변수를 참조할 수 있지만 변수는 최종 값입니다.
예 6:
/** * <body> * <ul> * <li>one</li> * <li>two</li> * <li>three</li> * <li>one</li> * </ul> */ var lists = document.getElementsByTagName('li'); for(var i = 0 , len = lists.length ; i < len ; i++){ lists[ i ].onmouseover = function(){ alert(i); }; }
마우스를 각
해결책 1:
var lists = document.getElementsByTagName('li'); for(var i = 0 , len = lists.length ; i < len ; i++){ (function(index){ lists[ index ].onmouseover = function(){ alert(index); }; })(i); }
해결책 2:
var lists = document.getElementsByTagName('li'); for(var i = 0, len = lists.length; i < len; i++){ lists[ i ].$$index = i; //通过在Dom元素上绑定$$index属性记录下标 lists[ i ].onmouseover = function(){ alert(this.$$index); }; }
해결책 3:
function eventListener(list, index){ list.onmouseover = function(){ alert(index); }; } var lists = document.getElementsByTagName('li'); for(var i = 0 , len = lists.length ; i < len ; i++){ eventListener(lists[ i ] , i); }
위 내용은 JavaScript 함수 클로저 사용에 대한 자세한 토론 및 자세한 코드 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!