在函数内定义函数,如果存在则运行

时间:2014-10-21 07:38:56

标签: javascript

我正在定义一个名为Validator的函数。在此,我将this.luhn定义为另一个函数。现在,如果引擎参数传递给Validator函数,并且引擎函数存在于Validator中,我想运行它。在这一点上,我得到"引擎方法luhn没找到"在我的日志中。

代码:

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(或任何其他功能),如果它是在"这个" ?

1 个答案:

答案 0 :(得分:3)

改为使用括号表示法:

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

...我宁愿选择engineName而不是engine(因为您传递的是函数名称,而不是函数本身)。说到这些,我不得不说我可能更倾向于采用这种方法来支持方法注入:在其他地方定义luhn函数,直接将它传递给Validator构造函数。

function luhn(cardnumber) { ... }

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

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