2012-06-10 3 views
1

foobar2000 뮤직 플레이어 용 WSH 구성 요소에 jscript 인터페이스를 구축하려고합니다.
어느 시점에서, 나는 동일한 함수를 호출하지만 다른 인수를 사용하는 다양한 수의 버튼을 만들어야합니다. 루프는이고 배열은을 사용하여 단추를 만들 수 있습니다. 그러나 모든 단추는 마지막 단추의 인수 만 전달합니다. 여기 다른 인수를 사용하여 함수를 호출하는 동적 단추를 만드는 방법

내가 버튼을 추가하는 데 사용하는 코드입니다 :이 경우

for (var i=0; i<_groupsArray.length; i++) { 
    _btn = _groupsArray[i]; 
    ƒview.addButton(_btn, _img, function() {setView(_btn)}, function() {doPlay(_btn)}); 
} 

을 _btn 내가 (버튼을 클릭 할 때 함수에 전달하려는 버튼의 라벨과 인수로 모두 사용된다 아티스트 이름 또는 앨범 제목 또는 이와 유사한 것입니다). ƒview은 단추를 보유하는 사용자 지정 개체입니다. 버튼의 위치를 ​​지정할 필요가 없도록 버튼을 만들었습니다. ƒview은 필요할 때마다 그들을 계산합니다.
이것은 실제로 버튼을 생성하는 addButton 메서드의 일부입니다 (나머지는 레이아웃을 계산합니다). 각 액션 인수는, addButton 메소드에 의한 처리를 실시하지 않고, 작성 중의 버튼에 파라미터로서 건네받습니다.

this.addButton = function(label, img, action1, action2, action3, action4, action5) { 
    ... 
    new ButtonObject(label, __x, __y, __w, __h, action1, action2, action3, action4, action5); 

마지막으로, 난 내 buttonObject 생성자이 있습니다

function ButtonObject(label, x, y, w, h, action1, action2, action3, action4, action5) { 
    ... 
    this.action1 = action1; 
    this.action2 = action2; 
    this.action3 = action3; 
    this.action4 = action4; 
    this.action5 = action5; 
    ... 
    this.act1 = function() { 
     var __doIt = function() {this.action1();}; 
     return __doIt; 
    } 

루프에 대한 동안 전달 된 함수는 마지막 조치 1, 조치 2 ... 속성과 객체에 저장됩니다.
내가 직접 this.action1()를 호출을 포함, ACT1 방법으로
조치 1 를 호출하는 여러 가지 방법을 시도; this.action1.apply(); 당신이 위에서 보는 것처럼 clausure를 형성하려합니다. 올바른 동작을 호출하지만 마지막 단추의 인수를 사용하면 충돌이 발생하거나 아무 효과가 없습니다.

나는 이제 시도 할 생각이 없습니다. 함수와 인수를 별도로 전달하는 부분적인 성공이 있었지만 이는 추악한 속임수입니다. clausures에 대한 많은 튜토리얼을 읽었고 로컬 변수를 유지하는 방법을 설명했지만이 경우에는 해당 변수를 관리 할 수 ​​없었습니다. 나는 내가 계속 어떻게

var __doIt = function() {this.action1();}; 

그래서 라인을 가리키는 "이 개체가이 속성 또는 메서드를 처리하지 않습니다"로 버튼을 클릭하면 내 마지막 시도는 (당신이 코드에서 볼 수 있듯이) 충돌합니다 각 버튼 내에 "살아있다"는 주장이 있습니까? 당신은 다만 그것을 결합, _btn의 가치를 개최 클로저를 만들 필요가

for (var i=0; i<_groupsArray.length; i++) { 
    _btn = _groupsArray[i]; 
    ƒview.addButton(_btn, _img, 
     function(b) {return function() {setView(b)};}(_btn), 
     function(b) {return function() {doPlay(b)};}(_btn) 
    ); 
} 

: 같은

+0

이것은 [Javascript closure inside loops] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) 문제와 유사합니다. –

답변

1

보십시오 뭔가. 여분의 래퍼 함수는 정확하게 그것을 수행합니다.

관련 문제