2013-02-21 3 views
1

루프에서 동적으로 생성 된 함수로 작업하고 있습니다.변수를 문자열로 삽입하는 방법은 무엇입니까?

for (var i = 0; i < 4; i++) { 
     window["functiontest" + i] = function() { alert(i); } 
} 

작동하지만 어떻게 작동 시키려하는지는 알 수 없습니다. 이렇게하면 functiontest0이 실행될 때 루프가 i에 추가되는 동안 실제로 var i에게 경고하므로 "3"으로 경고합니다.

내가 원하는 것은 현재 i을 어떻게 든 "하드 코드"하여 "3"이 아닌 "0"을 실제로 경고합니다.

window["functiontest" + i] = function() { 
    // I need just the current state for `i` here and 
    // not just the variable `i` - so for exampe I need 
    // it as `i` literally put 0 
} 

나는 "문자열"또는 뭔가에 결과를 작성하는 강제 수있는 방법이 있나요 :이 같은 말인가요?

도움 사람을위한 THX. 그리고 중복에 대한 미안하지만 그것을 검색하는 동안 아무것도 찾을 수 없습니다. 내가

:-)이 잘 설명을 couldnt하지만 난 이런 일에 결국 대부분 때문에 :

for (var genfunc = 0; genfunc < 4; genfunc++) { 

    if (genfunc == 0) { //left 
     window["keyDown" + sys_curcontrols[genfunc]] = (function (unique) { 
      return function() { window["sys_keyLeft" + unique] = -1; } 
     })(nid); 
    } 

답변

2

당신이 범위를 만들 수있는 기능을 사용하기 위해 필요로하는 곳에의 완벽한 예.

for (var i = 0; i < 4; i++) { 
    window["functiontest" + i] = (function(index) { 
     return function() { alert(index); } 
    })(i); 
} 
+0

아니요. 범위를 작성하는 함수를 실행할 때 가장 좋은 예입니다. 클로저를 자유 변수가있는 함수로 정의하면 방금 추가 한 함수는 클로저가 아닙니다. 그러나 반환하는 함수 (및 원래 코드의 함수)는 클로저이므로 문제가 존재하는 이유입니다 (JavaScript가 자유 변수를 처리하는 방식 때문에). –

+1

@FelixKling, 좋은 지적. 나는 대답을 수정했다. – Lukas

+0

thx for help :-) – JohnMalkowich

2

참조로 변수를 전달 중입니다. 값을 전달하는 익명 함수와 변수를 그림자 :

또한
(function(i) { 
    window['functiontest' + i] = function() { 
     alert(i); 
    }; 
})(i); 

,이 같은 전역을하지 않습니다. 객체 사용 :

var functiontest = {}; 

(function(i) { 
    functiontest[i] = function() { 
     alert(i); 
    }; 
})(i); 
+0

thx for help ...하지만 왜 전역을 사용하지 않는 것이 좋을까요? 나는 모든 곳에서 기능을 얻을 수 있어야합니다 ... 성능 문제입니까? – JohnMalkowich

+1

@ JohnMalkowich : 아니오, 유지 관리가 불가능합니다. 여기에 문제가되는 것은 전역이 아닙니다. 그것은 여러분이 객체에 포함되어야하는 전역 변수를 많이 만들고 있다는 것입니다. – Blender

관련 문제