Netizen은 다음 HTML과 같이 질문을했습니다. 왜 각 출력이 각 P를 클릭하는 대신 각 출력이 5인가? 해당 1, 2, 3, 4, 5에 알립니다.
<html> <head> <meta http-equiv = "content-type"content = "text/html; charset = utf-8"/> <title> 닫기 데모 </title> <script type = "text/javaScript"> function () {var pary = document.getEtagName ( "p"); for (var i = 0; i <pary.length; i ++) {pary [i] .onclick = function () {alert (i); }}}} </script> </head> <body onload = "init ();"> <p> 제품 1 </p> <p> 제품 2 </p> <p> Product 3 </p> <p> 제품 4 </p> <p> 제품 5 </p> </body> </html>몇 가지 해결책이 있습니다
1. 변수 i를 각 단락 객체 (P)에 저장합니다.
함수 init () {var pary = document.getElementsByTagName ( "p"); for (var i = 0; i <pary.length; i ++) {pary [i] .i = i; pary [i] .onclick = function () {alert (this.i); }}}2. 익명 함수 자체에 변수 i를 저장
함수 init2 () {var pary = document.getElementsByTagName ( "p"); for (var i = 0; i <pary.length; i ++) {(pary [i] .onclick = function () {alert (arguments.callee.i);}). i = i; }}3. 클로저 레이어를 추가하면 기능 매개 변수의 형태로 내부 함수로 전달됩니다.
함수 init3 () {var pary = document.getElementsByTagName ( "p"); for (var i = 0; i <pary.length; i ++) {(function (arg (arg).4. 클로저 레이어를 추가하면 로컬 변수 형태로 메모리 함수로 전달됩니다.
함수 init4 () {var pary = document.getElementsByTagName ( "p"); for (var i = 0; i <pary.length; i ++) {(function () {var temp = i; // 로컬 변수 pary [i] .onclick = function () {alert (temp);}}) (); }}5. 클로저 레이어를 추가하고 응답 이벤트로 함수를 반환합니다 (3의 미묘한 차이에 주목하십시오).
함수 init5 () {var pary = document.getElementsByTagName ( "p"); for (var i = 0; i <pary.length; i ++) {pary [i] .onclick = function (arg) {return function () {// 함수 alert (arg)를 반환합니다. } }(나); }}6. 실제로 함수 인스턴스가 생성 될 때마다 함수로 구현되면 폐쇄가 생성됩니다.
함수 init6 () {var pary = document.getElementsByTagName ( "p"); for (var i = 0; i <pary.length; i ++) {pary [i] .onclick = new 함수 ( "alert (" + i + ");"); new는 한 번에 하나의 함수 인스턴스를 생성합니다}}}7. 기능을 사용하여 구현하고 6의 차이에주의하십시오.
함수 init7 () {var pary = document.getElementsByTagName ( "p"); for (var i = 0; i <pary.length; i ++) {pary [i] .onclick = function ( 'alert ('+i+')')}}위의 것은 편집자가 당신에게 가져 오는 루프 클로저의 JavaScript에 대한 간단한 토론입니다. 모두가 wulin.com을 더 지원하기를 바랍니다