티스토리 뷰
목차
반응형
클로저를 활용할 경우 여러 장점이 있지만, 변수가 묶여 반복문이 비정상적으로 구동하는 경우가 있습니다. 예를 들면 아래와 같습니다.
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs[i] = function() {
console.log("My value: " + i);
};
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
의도는 1, 2, 3을 순차적으로 출력하는 것입니다. 하지만, 클로저 결과 화면처럼 3이란 숫자만 3번 출력됩니다.
문제는 변수 i 가 외부 변수에 바인딩된다는 것입니다. 하지만, 여러 해결책이 있습니다. 하나씩 알아보겠습니다.
◆ 인덱스 변수를 묶는 가장 간단하고 읽기 쉬운 방법
for (var i = 0; i < 3; i++) {
(function(index) {
console.log('iterator: ' + index);
})(i);
}
◆ 익명 함수가 같은 클로저를 사용하지 않도록 방지
var funcs = [];
for(var new_i =0; new_i<3; new_i++){
(function(i){
funcs[i] = function(){
console.log("exam : " + i);
}
})(new_i);
}
for(var j =0; j<3; j++){
funcs[j]();
}
◆ for 루프 범위를 매번 갱신하기
var funcs = []
for (let i = 0; i < 3; i += 1) {
funcs[i] = function () {
console.log("test : " + i)
}
}
for (var k = 0; k < 3; k += 1) {
funcs[k]()
}
◆ for 반복문 하나로 클로저 문제 해결하기
var funcs = [];
for (var i = 0; i < 3; i++) {
(funcs[i] = function() {
console.log("My value: " + i);
})(i);
}
◆ 쿼리 js (query-js) 사용
/* query js */
var funcs = Query.range(0,3).each(function(i){
return function() {
console.log("My value: " + i);
};
});
/* javascript */
funcs.iterate(function(f){ f(); });
Javascript 클로저 바인딩 예제는 여기까지입니다.
출처 : 스택오버플로우였습니다. [simple practical example]
관련 글
▷ get parameter get attribute 차이, getter setter 관점에서
▷ css 셀렉터(selector 선택자) 띄어쓰기 의미, div id
▷ 자바스크립트 날짜 계산 소스 (Date 함수)
ⓒ written by vicddory
반응형