JS中的函数返回undefined

时间:2010-03-22 19:43:11

标签: jquery

我有以下问题。警报allways返回undefined,但我知道它有一个值。我究竟做错了什么。我没有解决方案......

我正在使用JQUERY jquery-1.4.2.min.js

提前Tnx

$(document).ready(function(){
    $('#generateButton').click(createIBAN);
});

function createIBAN(){
    //---- First check if a bank has been selected,
    //---- if not, then show error
    if($('#selectBank').val()==''){
        alert('Selecte a bank!');
    }else{
        var bankAccount =   generateBankAccount();
        alert(bankAccount);
    }
    return false;
}

function generateBankAccount(){
    //---- Create "elfproef" bankaccount
    var bankAccount =   '';
    //---- Set the amount of digits in a bankaccount
    digitAmount     =   9;
    //---- Make random digitstring
    for (var i = 0; i < digitAmount; i++) {
        bankAccount += Math.floor(Math.random() * digitAmount);
    }
    //---- validate the string, if not "elf-proef"
    if (elfProef(bankAccount)==false) {
        //---- regenerate the string
        generateBankAccount();
    }else{
        return  bankAccount;
    }
}

function elfProef(bankAccount) {
    //---- set sum to 0 and start the for-loop for counting
    var sum = 0;
    for (var i = 0; i < digitAmount; i++) {
        //---- for every digit multiply it times 9 - number 
        //---- of the digit and count it to the sum var
        sum += bankAccount.charAt(i) * (digitAmount - i);
    }
    //---- Check if sum can be devided by 11 without having ##,##
    if(sum % 11==0){
        //---- return true means string is "elf-proef"
        return true; 
    }else {
        //---- String is not "elf-proef", try again
        return false;
    }
}

4 个答案:

答案 0 :(得分:7)

本节:

if (elfProef(bankAccount)==false) {
    //---- regenerate the string
    generateBankAccount();
}else{
    return  bankAccount;
}

如果elfProef返回false,则永远不会返回bankAccount。它只会运行generateBankAccount,它将返回一个永远不会被使用的值。尝试将其更改为:

if (elfProef(bankAccount)==false) {
    //---- regenerate the string
    return generateBankAccount();
}else{
    return  bankAccount;
}

答案 1 :(得分:1)

我认为generateBankAccount是一个递归函数,对吗?如果这是真的,你忘了在嵌套调用前放置“return”。

答案 2 :(得分:0)

我认为您需要将generateBankAccount中的if else更改为如下所示:

if (elfProef(bankAccount)==false) {
    //---- regenerate the string
    return generateBankAccount();
}else{
    return  bankAccount;
}

否则你对generateBankAccount的递归调用将不会做任何事情。

答案 3 :(得分:0)

制作本:

if (elfProef(bankAccount)==false) {
    //---- regenerate the string
    generateBankAccount();
}

进入这个:

if (elfProef(bankAccount)==false) {
    //---- regenerate the string
    return generateBankAccount();
}

您可以考虑在不递归的情况下重写函数:

do {
    bankAccount = '';

    for (var i = 0; i < digitAmount; i++) {
        bankAccount += Math.floor(Math.random() * digitAmount);
    }    
}
while (!elfProef(bankAccount));

return bankAccount;

使用循环使逻辑变得更加简单,并且在大量尝试后无法生成有效帐号的情况下,它不会占用堆栈空间。