2014-06-05 4 views
1

내 코드에 문제가 있지만 그 코드를 찾을 수 없습니다. 처음 registerStartDateValidation을 호출하면 defineKeyword 클로저의 startDateValidation 변수 값은 물론 클로저 외부에서 영향을받은 변수와 동일합니다. 그러나 두 번째로 변수는 다른 값으로 재 지정되지만 defineKeyword의 startDateValidation 값은 registerStartDateValidation을 처음 호출 한 값과 여전히 동일합니다. 클로저가 변수를 캐시합니까?클로저가 변수를 캐시합니까?

Tv4.prototype.registerStartDateValidation = function (attributes) { 
    var helper = this; 
    var dateNames = Object.keys(attributes); 
    var startDateName = dateNames[0]; 
    var startDateString = attributes[startDateName]; 
    var endDateName = dateNames[1]; 
    var endDateString = attributes[endDateName]; 
    var startDateValidation = helper.startDateValidation(startDateString, startDateName, endDateString, endDateName); 

    console.log(startDateValidation)//First time equal "true", second time equal "false" 

    tv4.defineKeyword('startDate', function (data, value) { 
     if (value === 'startDate') { 
      console.log(startDateValidation)//First time equal "true", second time still equal "true" 
      return startDateValidation 
     } 
    }); 

}; 

ajax 요청을하는 것이 아무것도 없으므로 함수가 호출되는 순서가 엉망이 될 수 있습니다.

+0

바이올린을 만들 수 있습니까? –

+0

당신이 얻고있는 결과는 들리지 않을 것이며, [test] (http://jsfiddle.net/k43X4/)는 두 로그 모두 똑같은 것을 반환해야 함을 보여줍니다. helper.startDateValidation은 비동기식입니다. 또는 비동기식입니다. – adeneo

+0

아니요 비동기가 아니지만 startDateValidation을 멤버 데이터로 설정하면 알아 차렸습니다. this.startDateValidation, startDateValidation은 좋은 정보를 가지고 있습니다. 하지만 멤버 변수로 설정하고 싶지 않습니다 ... –

답변

0

짧은 답변 : 아니요, 클로저는 변수를 캐시하지 않으므로 코드에 다른 내용이 있습니다. 문제를 보여주는 단순한 완전한 예제로 문제를 줄이면 문제가 어디에서 왔는지를 분명히 알게되거나 적어도 다른 사람들이 알아낼 수있게 도와줍니다.

그러나 너는 this project 인 것처럼 보이므로 어떤 일이 일어나고 있는지 파악할 수 있습니다. Tv4.defineKeyword()은 동일한 키워드에 대해 여러 번 호출되는 경우 목록에 새 함수를 추가합니다. (소문자 't'참고)가 아닌 또는 this.defineKeyword을 호출하면 registerStartDateValidation에 대한 각 호출이 동일한 인스턴스에 영향을 미치므로 거의 확실하게 그것을 대체하십시오.

+0

유효성 검사를 추가하고 대체하지 않는 것을 알고 TV4는 tv4를 래핑하는 사용자 정의 도우미입니다. 왜 내 registerStateDateValidation 함수의 tv4.defineKeyword 콜백이 외부 범위에서 전달 된 새 값을 고려하지 않는지 알 수 없습니다. 그러나 클로저가 캐시되지 않았 음을 확인해 주셔서 감사합니다. –

+0

@Maxwell이 문제에 대한 자세한 정보/도움말을 찾으려면 완전한 예제를 게시해야 할 필요가 있다고 생각합니다. –

관련 문제