문제

이 질문은 이미 여기에 답이 있습니다.

다음 JavaScript 코드를 고려하십시오.

var a = [];

var f = function() {

    for (var i = 0; i < 3; i++) {
        a.push(function(){alert(i)});
    }
    for (var j = 0; j < 3; j++) {
        a[j]();
    }
};

알림은 '3'을 세 번 모두 인쇄합니다. 나는 다른 동작을 원합니다 - 루프의 각 반복에서 i의 현재 값을 인쇄하는 함수를 생성합니다. 즉, 다른 지수를 인쇄하는 기능.

어떤 아이디어?

도움이 되었습니까?

해결책

수락하는 익명 함수를 만듭니다 i 매개 변수로서 해당 특정 함수를 반환합니다.

for (var i = 0; i < 3; i++) {
    a.push((function(i) {
        return function() {
            alert(i);
        }
    })(i));
}

for (var j = 0; j < 3; j++) {
    a[j]();
}

또는 비슷한 일을하십시오 : 수락하는 익명 기능을 만듭니다. i 배열에 함수를 추가하는 매개 변수로 :

for (var i = 0; i < 3; i++) {
    (function(i) {
        a.push(function() {
            alert(i);
        });
    })(i);
}

for (var j = 0; j < 3; j++) {
    a[j]();
}

다른 팁

또 다른 접근법, 사용 카레:

var a = [];
var f = function() {
    for (var i = 0; i < 3; i++) {
        a.push((function(a){alert(a);}).curry(i));
    }
    for (var j = 0; j < 3; j++) {
        a[j]();
    }
};

// curry implementation
Function.prototype.curry = function() {
  var fn = this, args = Array.prototype.slice.call(arguments);
  return function() {
    return fn.apply(this, args.concat(
      Array.prototype.slice.call(arguments)));
  };
};

위의 스 니펫 실행을 확인하십시오 여기.

var iterate = (function () {
    var i, j = [];
    for (i = 0; i < 3; i += 1) {
        j.push(i);
        alert(j[j.length - 1]);
    }
}());

값을 출력하기 위해 폐쇄가 필요하지 않습니다. 그러나 코드는 객체 지향 격리 기능에 포함되어야합니다. 실행되기 위해 기능을 호출 할 필요가 없습니다.

루프의 본문을 익명 기능으로 넣을 수 있습니다.

var a = [];

for(var i = 0; i < 3; i++) (function(i) {
    a.push(function() { alert(i); });
})(i)

for(var j = 0; j < 3; j++) {
    a[j]();
}

그 함수를 만들고 "i"라는 루프의 값을 인수로 전달함으로써, 우리는 본질적으로 외부 "i"를 숨기는 루프 본문 안에 새로운 "i"변수를 만들고 있습니다. 배열로 푸시하는 클로저는 이제 새로운 변수를 보게됩니다. 값은 외부 기능 함수가 첫 번째 루프에서 호출 될 때 설정됩니다. 새 변수를 만들 때 다른 이름을 사용하면 더 명확해질 수 있습니다.

var a = [];

for(var i = 0; i < 3; i++) (function(iNew) {
    a.push(function() { alert(iNew); });
})(i)

for(var j = 0; j < 3; j++) {
    a[j]();
}

"inew"의 값은 0, 1, 2, 2가 루프에 의해 즉시 호출되기 때문에 할당됩니다.

함수 (i) {alert (i)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top