2010-03-22 144 views
0

我有以下问题。警报总是返回未定义,但我知道它有一个值。我究竟做错了什么。我出的解决方案......JS中的函数返回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; 
    } 
} 

回答

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; 
} 
+0

+1对于返回函数结果 – 2010-03-22 19:57:01

+0

该死的,这对我来说很愚蠢,tnx,它有帮助。 – Megapool020 2010-03-22 21:54:58

1

我把它generateBankAccount是一个递归函数,对?如果这是真的,你忘记把“返回”放在嵌套调用的前面。

0

我认为你需要改变,如果其他的generateBankAccount,内容如下:

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

,否则你到generateBankAccount递归调用不会做任何事情。

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; 

使用循环使得逻辑更简单,它如果你在一个很大的后面无法生成一个有效的帐号,那么它不会咀嚼堆栈空间尝试次数。