2011-05-03 8 views

답변

14

는 차이가 없습니다. 두 경우 모두 anotherFn이 즉시 실행됩니다.

그러나 루프에서 함수를 만들 때 즉시 함수가 자주 사용됩니다.

예 (다소 의사 코드)를 고려해

for(var i from 1..10) { 
    elements[i].onclick = function() { 
     alert(values[i]); 
    } 
} 

자바 스크립트 기능 만 범위없이 블록 범위 같이, 모든 이벤트 핸들러는 이후 값 10있을 것 같은 i를 공유 루프가 완료되었습니다. 따라서 모든 처리기는 values[10]에 경고하려고합니다. 직접적인 함수를 사용하여

새 범위는 "캡처"루프 변수의 현재 값이 도입된다 :이로

for(var i from 1..10) { 
    (function(index) { 
     elements[i].onclick = function() { 
      alert(values[index]); 
     } 
    }(i)); 
} 

를 다른 기능을 반환 독립 함수를 생성 읽는 것이 어려운 종종 더 나은 것입니다 :

function getHandler(value) { 
    return function(){alert(value);}; 
} 

for(var i from 1..10) { 
    elements[i].onclick = getHandler(values[i]); 
} 
+0

이것은 좋은 예입니다! – Rudie

+0

(var i from 1..10) {} –

+0

@cf_PhillipSenn : 예 JavaScript가 아닙니다. * "이 예제를 (다소간 ** 의사 코드 **) 고려해보십시오."* –

1

첫 번째는 self-invoking function (함수를 실행 함)을 정의하고 두 번째 함수는 방금 함수를 실행합니다. 두 경우 모두에 전달 된 인수는 [i]입니다.

+0

어떤 차이가 있습니까? 아니면 프로그램이 동일하게 작동합니까? – bsr

+0

자체 호출 함수를 설명하는 링크를 추가했습니다.이 경우에는 함수를 사용할 이유가 없습니다. – hvgotcodes

+0

아니요,이 경우에는 차이점이 없습니다. 클로저가 실제로 비어 있기 때문입니다. – Rudie

3

예제의 두 인스턴스에서 값은 동일한 작업을 수행합니다. 첫 번째 방법 (자체 실행 익명 함수 사용)을 신중하게 사용하지 않으면 i 값이 증가하고 함수에 올바르게 전달되지 않는 다른 예제가 있습니다. 여기

루프에서 만드는 폐쇄 아래로 스크롤, 가이드의 : 일반적인 실수 섹션이 문제를보고 :이 예에서

https://developer.mozilla.org/en/JavaScript/Guide/Closures

관련 문제