2013-06-27 2 views
1

이전에이 질문을 받았지만 검색 할 항목을 모르겠습니다.범위 지정 문제가있는 익명 함수 호출

그래서 함수를 클릭 한 항목에 해당하는 문자열로 호출하려고하지만 단순히 문자열 배열에 새 항목을 추가하려고합니다. 루프에서 다음과 같이 사용된다

var menuList = ["overview", "help", "search"]; 
var functionCalls = [ 
    function() { toggleMenu(menuList[0]); }, 
    function() { toggleMenu(menuList[1]); }, 
    function() { toggleMenu(menuList[2]); }, 
]; 

: $("something").click(functionCalls[i])

이 내가이 원하는 것입니다 (하지만 분명히 작동하지 않습니다) :

for (var i in menuList) { 

    // This does not work because the closure references 'i' 
    // which, at the end, is always the index of the last element 
    $("something").click(function() { 
    toggleMenu(menuList[i]); 
    }); 

    // this works, but I have to define each closure 
    $("something").click(functionCalls[i]); 
} 

어떻게 할 수 변수를 기반으로 값을 받아들이지 만 변수에 대한 참조를 유지하지 않는 익명의 함수를 만듭니다.

+1

JavaScript에서 배열을 반복하는 데'for ... in'을 사용하지 마십시오. 인덱스 변수와 간단한'for' 루프를 대신 사용하십시오. – Pointy

+0

이 질문에는 많은 중복이 많이 있습니다. 자바 스크립트에서 매우 흔한 함정입니다. – Pointy

+0

그 이유는 내가 이전에 물어 보았다고 확신하는 이유입니다. JS를 제대로 다루는 방법을 알기 위해 JS에 익숙하지 않거나 검색 할 대상을 찾지 못했습니다. – tsjnsn

답변

3

당신은이 같은 인생 사용할 수 있습니다 익명 함수를 호출하여

for (var i=0; i<menuList.length; i++) { 
    !function(index) { 
    $("something").click(function() { 
     toggleMenu(menuList[index]); 
    }); 
    }(i); 
} 

을, 당신은 이름 index으로 i에 대한 현재 값의 로컬 복사본을 만들 수 있습니다. 따라서 모든 핸들러는 해당 버전 i을 수신합니다.

+0

이것은 내가 찾고 있었던 것이다. 감사! – tsjnsn