2010-07-11 2 views
2

예 : 나는 O3를 호출 할 때이 익명의 Javascript 함수가 올바른 변수를 참조하도록하려면 어떻게해야합니까?

var o = {}; 
for(var i = 0; i < 5; i++) { 
    o[i] = function() { 
     console.log(i); 
    }; 
} 

o[3](); 

, 그것은 항상 내가 O0, O4, 또는 그 중 하나를 호출 할 경우에도 콘솔에 5 표시됩니다. 그것은 내가 마지막으로 가지고있는 값이기 때문에 항상 5를 표시합니다. 익명의 기능이 만들어지면 어떻게 값을 표시하게 할 수 있습니까? o3에서와 같이 콘솔에 3을 표시해야합니다.

답변

5

당신은 어떻게해야 : 무엇을 어떻게하면 그렇게 내가의 상태를 유지하는 등 폐쇄라고 무언가를 창조한다는 것이다

var o = {}; 
for(var i = 0; i < 5; i++) { 
    (function(i) { // <- self-executing anonymus function with a parameter i 
    o[i] = function() { 
     console.log(i); // <- i here will be the argument i, 
         // not the i from the loop 
    }; 
    })(i); // <- pass i as an argument 
} 

o[3](); 

.

폐쇄는 내부 함수외측 함수에 대한 참조를 유지하고 있으므로 그 변수합니다 (외부 함수 반환 후에도) 매개 변수에 대한 액세스를 얻는 것을 의미한다. 폐쇄

일반의 예는 다음과 같습니다

function outer(arg) { 
    var variable = 5; 
    arg = 2; 
    function inner() { 
    alert(variable); // <- the inner function has access to the variables 
    alert(arg);  //  and parameters of the outer function 
    } 
} 

자체 실행 (자동 호출, 또는 즉시) 함수가 선언 된 직후에 호출되는 함수입니다.

(function() { 
    alert("executed immediately"); 
})(); 

둘의 조합 만 기능은 자바 스크립트 범위을 가지고 있다는 사실은, 내가의 상태를 유지하는 새로운 기능을 가진 범위을 만들기 위해 위에서 언급 한 기술로 리드 그렇지 않으면 클로저 때문에 내부 함수에 의해 변경됩니다.

+0

고맙습니다. – fent

1
o[i] = (function (i) { 
    return function() { console.log(i); } 
})(i); 
관련 문제