2012-03-15 2 views
-1
this.config = { 
    source: psource, 
    _events: [ 
     'value1', 
     'value2', 
     'value3' 
    ] 
}; 

// Add callbacks to source 
var that = this; 
for (var i = this.config._events.length - 1; i >= 0; i--) { 
    var name = this.config._events[i]; 
    console.log(name); // correct 

    $(this.config.source).on(name, function() { 
     console.log(name); // value1 
     console.log(that.config._events[i]); // undefined 
    }); 
} 

여기서 무엇이 잘못되었는지 알 수 없습니다. 모든 복잡한 버전을 제거하고 가장 단순하게 넣었습니다. 전혀 작동하지 않으려 고합니다. 첫 번째 console.log은 모든 올바른 이름을 올바르게 출력하지만 루프가 한꺼번에 발생하는 것처럼 작동 한 다음 내측 console.log의 경우 다시 수행합니다.루프 내 닫힌 함수의 변수에 영향을주는 클로저

누구든지 잘못된 것을 볼 수 있습니까?

console.log(that.config._events[i]); // undefined

i가되고 -1 당신의 폐쇄가 호출 될 때마다 끝날 것이라고 블록에서

+0

"클로저가 모든 것에 영향을 미치고 있습니다."라는 문구는 문제를 설명하지 않고 클로저가 작동하는 방식입니다. 닫는 범위의 모든 변수는 클로저에 포함됩니다. – nrabinowitz

+0

질문의 제목을보다 구체적으로 수정하십시오. 나는 당신이 'for loop'이라는 단어를 언급해야한다고 생각합니다. – viebel

+0

http://stackoverflow.com/questions/2192348/closures-in-a-for-loop – viebel

답변

2

.

당신은 자바 스크립트에서 약 i

$(this.config.source).on(name, function(i) { return function() { 
     console.log(name); // value1 
     console.log(that.config._events[i]); // undefined 
    }; 
}(i)); 
+0

더 나은 방법으로,'i'를'. on' 메소드를 호출하고,'event.i'를 이용하여 변수에 접근합니다. 내 제안에 대한 자세한 내용은'.on()'문서를 참조하십시오. http://api.jquery.com/on/ –

+0

@RobW 이것은 i가 숫자 프리미티브이기 때문에 아마도이 상황에서 작동 할 것입니다. 그러나 나는이 솔루션을 고의적으로 선택하여 연산자가 클로저의 변수에 대한 참조를 유지하는 것이 클로저 생성시 현재 값에 대한 참조를 유지하는 것과 동일하지 않다는 것을 이해할 수 있도록했습니다. – Damp

-1

클로저를 생성하기 위해 종류의 일을 할 것, for 루프 내부의 함수를 정의하지 않는 것이 좋습니다.

대신 each을 제공하는 javascript 라이브러리를 사용해야합니다. underscore. 그러면 코드는 다음과 같이 보입니다.

_.each(this.config._events, function(e) { 
     $(this.config.source).on(name, function() { 
      console.log(e); 
     }); 

이전에 배열을 뒤집을 수 있습니다. 여기

당신은 또한 사용할 수있는 doc for _.each

입니다 jQuery의 유사한 인터페이스를 제공 $.each.

+1

-1'for' 루프 안에서 함수를 정의하는 것은 안전합니다. 변수 범위와 클로저 작동 방식을 알고 있어야합니다. – Damp

+1

나는'안전하지 않다'를'위험한'것으로 바꿨다. 이것은 많은 혼란을 낳습니다. 실제로'jslint'는 그것을 허용하지 않습니다. 다시 – viebel

+1

에 대해 아무 것도 위험하지 않은 것으로 투표하십시오. 그것은 꼭해야만합니다. 나는 -1로 서있다. 그'jslint'는 자바 스크립트 문제가 아니라 선택입니다. – Damp

관련 문제