2014-10-21 3 views
2

Validator라는 함수를 정의하고 있습니다. 이 내에서 this.luhn을 다른 함수로 정의합니다. 이제 엔진 매개 변수가 Validator 함수에 전달되고 엔진 함수가 Validator 내부에 있으면이를 실행하고 싶습니다. 이 시점에서, Im은 "내 엔진 로그에"엔진을 찾을 수 없습니다. "라는 메시지가 나타납니다.함수 내부에서 함수를 정의하고 실행하면

코드 :

var Validator = (function(cardnumber, cardtype, engine){ 
    this.cardnumber = cardnumber; 
    this.cards = {"mastercard":"51,52,53,54,55", "visa":"4"}; 
    this.luhn = (function(cardnumber){ 
     var len = cardnumber.length, 
      mul = 0, 
      prodArr = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]], 
      sum = 0; 

     while (len--) { 
      sum += prodArr[mul][parseInt(cardnumber.charAt(len), 10)]; 
      mul ^= 1; 
     } 
     return sum % 10 === 0 && sum > 0; 
    }); 
    if(typeof this.engine != "undefined"){ 
     this.engine(); 
    } 
    else { 
     console.log("Engine for method " + engine + " not found"); 
    } 
}); 

나는 그것을 시작하는 방법 :

var test = new Validator('4861224212948679', 'visa', 'luhn'); 

이 경우 누구의 luhn (또는 그 문제에 대한 모든 다른 기능) 렁 올바른 방향으로 날 지점 수 "this"안에 정의되어 있습니까? 대신

+0

'이 [엔진 (에 cardNumber)'대신과 typeof this.engine의 (대해서 typeof 엔진 === "기능")! = "정의"를 사용한다 –

+0

. "this"를 제거하십시오. 호출하기 전에 매개 변수가 아니라 "this"속성을 호출합니다. – Amitesh

+0

또 다른 메모 : 카드 번호에서 항상 빼낼 수 있다면'cardtype '을 전달하는 이유는 무엇입니까?) – raina77ow

답변

3

사용 브래킷 표기 : (당신이 기능으로 자신을하지 함수 이름을 통과)

if (typeof this[engine] === 'function') { 
    this[engine](cardnumber); 
} 

... 그리고 차라리 대신 engine의 여기 engineName를 선택하는 것입니다. 말하자면, 나는 아마도 메소드 삽입에 찬성하여이 접근법을 버리는 것이 더 좋을 것이라고 말하고 싶다 : define luhn 함수를 다른 곳에서 정의하고, 그것을 Validator 생성자에 직접 전달한다.

function luhn(cardnumber) { ... } 

// inside Validator function 
if (typeof engine === 'function') { 
    engine(cardnumber); 
} 

var validator = new Validator('5555...', 'Mastercard', luhn); 
+0

고마워요. 이것은 매우 도움이되었습니다. 1 분 안에 받아 들일거야. –

관련 문제