2012-08-25 4 views
0

이 문제와 관련된 것으로 보이는 몇 가지 질문을 발견했지만 내 이해의 범위 내에서 광산이 다르므로 여기에 있습니다. 내가 크게 내 코드를 단순화, 심지어 주석과 한 줄을 교체하지만, 개념은 동일이 ... 위젯 나는 새로운 객체를 생성하고 이벤트를 추가하고 각각에 대한 그래서 내부 JavaScript 함수에 외부 객체 포함

function myFunction(options) { 
    var button; 
    options.widgets.forEach(function (w) { 
     button = document.createElement("button"); 
     //add button to the DOM 
     aListOnMyPage.addEventListener("selectionchanged", function (args) { 
      var a = button; 
     }); 
    }); 
} 

Listener를 내가 작성한 DOM 요소 (버튼)를 참조해야하는 페이지의 목록에 추가합니다. 내가 보는 동작은 이벤트 수신기를 만들 때 버튼이 올바르게 설정되지만, 수신기의 이벤트가 발생하면 버튼은 항상 내가 마지막으로 만든 버튼에 대한 참조입니다. 아마도 늦은 것 같아요.하지만 이런 식으로 행동 할 이유가 내 머리를 감쌀 수는 없어요. 아무도 나를 위해 이것을 명확히 할 수 있습니까?

+0

"javascript loop last value"또는 유사 항목을 검색하십시오. –

+0

예 : http://stackoverflow.com/questions/6425062/passing-functions-to-settimeout-in-a-loop-always-the-last-value, http://stackoverflow.com/questions/6599157/why-always- 루프에 사용 된 객체에 대한 마지막 참조 (last-reference-the-object-is-in-loop) 등은 약간 다른 모습의 동일한 문제입니다. –

답변

3

물론 가능합니다.

여기의 문제는 실제로 범위입니다. 작성한 코드를 살펴 보겠습니다.

function myFunction(options) { 
    var button; 
    options.widgets.forEach(function (w) { 
     button = document.createElement("button"); // UH-OH... 
     //add button to the DOM 
     aListOnMyPage.addEventListener("selectionchanged", function (args) { 
      var a = button; 
     }); 
    }); 
} 

알려 주실 수 있습니까? buttondocument.createElement("button")과 같아야한다고 선언했지만 var 키워드를 사용하지 않으므로 여러 개의 로컬 변수 대신 하나의 전역 변수가 선언되었습니다. 즉, 루프가 실행될 때마다 하나의 전역 변수가 리스너에 의해 참조되고있어 문제가 발생합니다.

당신과 같이 여기에 로컬 변수를 사용하십시오 :

function myFunction(options) { 
    options.widgets.forEach(function (w) { 
     var button = document.createElement("button"); 
     //add button to the DOM 
     aListOnMyPage.addEventListener("selectionchanged", function (args) { 
      var a = button; 
     }); 
    }); 
} 

이 크게 상황을 개선해야한다. 적어도 당신이 한 걸음 더 나아갈 수 있기를 바랍니다. 행운을 빌어 요.

+1

클로저에 대해서는 정확하지만 * 버튼에 대해서는 글로벌하지 않습니다. OP에서는 외부 함수에 국한됩니다. – RobG

+0

사실, 코드를 단순화 할 때 루프 바깥에 있던 var 버튼을 제거 했으므로 전역 적이 아니었지만 이것이 내 문제였습니다. 나는 그것이 그것이 폐쇄 문제가 될 것으로 기대함으로써 너무 어렵다고 생각한다. 고마워, @ lunchmeat317 !! –

1

나는 클로저 때문에이 문제에 직면 해 있다고 생각한다. 여러분이 사용하는 버튼 변수는 모두 myFunction이다. 모든 변경 사항은 참조 변경 사항이므로 익명 함수 내부의 변수 선언을 변경하면이 문제를 해결할 수 있다고 생각한다. 문제.

function myFunction(options) { 
    //var button; 
    options.widgets.forEach(function (w) { 
     var button = document.createElement("button"); 
     //add button to the DOM 
     aListOnMyPage.addEventListener("selectionchanged", function (args) { 
      var a = button; 
     }); 
    }); 
} 

변경 별도 button 변수 forEach 익명의 기능을 제공한다.

+1

리스너의 * a * 변수, * 버튼 *은 외부 "각"함수에서 선언 된 변수에 대한 클로저를 가지므로 직접 사용할 수 있습니다. – RobG

+0

알다시피, 나는 가능한 코드를 코드로 유지하려고 노력했다. – Vignesh

관련 문제