2013-03-05 2 views
0

클로저를 사용하여 배열을 업데이트하는 가장 좋은 방법입니까? 다른 사이트에서 이와 비슷한 것을 보았습니다. 내가 만든 글로벌 변수 closure1에 대해 궁금했다. 글로벌을 만들지 않고도이 작업을 수행 할 수있는 방법이 있습니까?클로저에 배열 저장

<script> 
    var closure1=Closure(0, 0); 

    function Closure(num, i) { 
     var num=num; 
     var index=i; 
     var anArray = []; 
     return function(num,index) { 
      anArray[index]=(num); 
      out.innerHTML=anArray; 
     } 
    } 
</script> 

<div id="d1" onclick=" closure1(2,0)">2 index 0</div> 
<div id="d2" onclick=" closure1(5,3)">5 index 3</div> 
<div id="d3" onclick=" closure1(4,1)">4 index 1</div> 
<div id="d4" onclick=" closure1(9,7)">9 index 7</div> 
<div id="out" >?</div> 
+0

Closure()에 전달 된 두 매개 변수는 무엇입니까? 그 값은 반환 된 익명 함수가 사용하지 않는 지역 변수에 저장됩니다. – nnnnnn

+0

질문에 관련이 없기 때문에 그 물건을 나왔습니다. 기본적으로 로컬 배열에서 클로저로 옮겨 가고 있습니다. 실제 배열 값은 onclick이 아니라 다른 함수를 통해 함수에 푸시됩니다. – user1740058

+0

그래도 실제 코드에 더 가까운 것을 표시하지 않으면 "이것이 최선의 방법입니까?"라는 질문에 대답 할 수 없습니다. 인라인 이벤트 속성은 전역을 필요로하지만 지금은 실제로 사용하지 않는다고 말하면 ... – nnnnnn

답변

0

당신은 당신이 onclick 속성 내에서 사용하기 위해 만든 폐쇄를 호출 할 수있는 방법이 필요합니다. closure1을 전역 변수로 사용하는 이점은 클로저가 한 번만 만들어지고 closure1(num, index)을 호출하여 페이지에서 다시 사용할 수 있다는 것입니다. 그러나 전역 범위에 closure1이라는 변수가있는 것을 원하지 않는 경우 다음과 같이 을 정리하면을 정리할 수 있습니다.

편집 : 이전에 제안 된 두 가지 방법을 게시했습니다. @nnnnnn에게 감사 드리며, 그 중 하나가 OP 코드를 위반할 것이라고 지적했습니다. 잘못된 제안을 삭제하고 올바른 제안을 그대로 둡니다.

기존 Closure 함수에 클로저를 속성으로 추가 할 수 있습니다.

var closure1=Closure(0, 0); 

Closure 기능과 같이, 정의 된 다음에 다음 줄을 추가 : 새 폐쇄를 만들려면이

이 줄을 제거 같은 예를 들어, closure1 당신은 그것을 만들어야합니다 :

<div id="d1" onclick="Closure.closure1(2,0)">2 index 0</div> 

Closure.closure1 = Closure(0, 0); 

및 교체하여 onclicks 다음과 같이 보일 것이다 6,

전체 코드는 다음과 같습니다

<script> 
    function Closure(num, i) { 
     var num=num; 
     var index=i; 
     var anArray = []; 
     return function(num,index) { 
      anArray[index]=(num); 
      out.innerHTML=anArray; 
     } 
    } 

    Closure.closure1 = Closure(0, 0); 
</script> 

<div id="d1" onclick="Closure.closure1(2,0)">2 index 0</div> 
<div id="d2" onclick="Closure.closure1(5,3)">5 index 3</div> 
<div id="d3" onclick="Closure.closure1(4,1)">4 index 1</div> 
<div id="d4" onclick="Closure.closure1(9,7)">9 index 7</div> 
<div id="out" >?</div> 

이 내 의견에 가장 깨끗한 방법입니다. 희망이 도움이됩니다.

+0

옵션 1은 OP의 코드와 동일하지 않습니다. 왜냐하면 각 인스턴스가 동일한 배열을 공유하는 대신 자체의 배열을 가지기 때문입니다. – nnnnnn

+0

코드 작동에 문제가 있습니다. 어디에서 "Closure.closure1 = Closure (0, 0);" 가기? 나는 그것을 내부와 외부에서 모두 시도했다. – user1740058

+0

@ user1740058 내 대답이 업데이트되었습니다. 클로저 함수가 정의 된 이후에 줄을 써야합니다. –

0

나는 이런 식으로 할 수 있다고 생각합니다. 전역 변수를 작성하지 않으려면 자체 실행 함수에서 스크립트를 래핑하십시오.

(function(){ 
     var closure1=Closure(0, 0); 

     function Closure(num, i) { 
     var num=num; 
     var index=i; 
     var anArray = []; 
     return function(num,index) { 
      anArray[index]=(num); 
      out.innerHTML=anArray; 
     } 
     } 
    }()); 
+1

이제 closure1이 로컬이므로 함수 외부에서 호출 할 수 없으므로 – user1740058

+0

@ user1740058 - 사실이지만 질문은 글로벌이 없어도 인라인 이벤트 속성과 함께 작동하지 않는 것이 었습니다. 당신은 두 가지 방법 모두 가질 수 없습니다. – nnnnnn