2014-10-16 64 views
0

我写了一个函数来计算函数的模数,但是当我在控制台中运行它时,它总是返回undefined。如果我使用console.log,我可以看到它正在计算正确的值。使用JavaScript计算模数返回undefined

function modulo(sum, divider){ 
 
    function loop(difference){ 
 
    if(difference < divider){ 
 
    console.log(difference) 
 
    return difference 
 
    } else { 
 
     setTimeout(loop(difference - divider), 0) 
 
    } 
 
    } 
 
    
 
    return loop(sum - divider) 
 
} 
 

 
modulo(8, 5) // 3

我要的是这回的答案 例如

var result = modulo(8, 5) // 3

更新:

较好地解决了这一问题将是

modulo = function (x,y){ return x - y * Math.floor(x/y) }

+2

注:'的setTimeout()',如果使用得当,会使得'function'异步/事件驱动下的电流,无法'return'标准。请参阅“[为什么我的变量在修改函数内部后没有改变?](http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside “为什么我说”*如果使用正确*,“请参阅”[为什么当我使用setTimeout时立即执行该方法?](http://stackoverflow.com/questions/) 7137401 /为什么是方法执行立即当我使用settimeout)“ – 2014-10-16 15:19:04

+0

感谢您的评论乔纳森:-) – Peter 2014-10-17 08:23:50

回答

2

要回答你原来的问题,setTimeout是异步的,和你的loop函数返回不确定的,因此,你得到未定义。要做到你想做的,直接拨打loop,或使用承诺。

但是另一方面,即使你要实现模数,这也是一个糟糕的方法。改为使用一些更好的division algorithms

+0

你的意思是这个gcd公式? '函数gcd(a,b) if b = 0 return a else return gcd(b,a mod b)'请您进一步解释一下吗? – Peter 2014-10-16 16:09:58

+0

啊!明白了--'mod = function(x,y){return x - y * Math.floor(x/y)}' – Peter 2014-10-17 09:33:19

3

您不必为此创建新的功能,JavaScript的已经有了它自己的模数运算符:%

8 % 5 
-> 3 

如果你真的想变成一个功能,您可以简单:

function modulo(sum, divider) { 
    return sum % divider; 
} 
modulo(8, 5); 
-> 3 
+0

谢谢詹姆斯,你是对的,但我是这样做的一个编码练习 – Peter 2014-10-16 16:05:26

0

因为你的代码不会从循环中返回值。

试试这个:

function modulo(sum, divider) { 
 
    function loop(difference) { 
 
    if (difference < divider) { 
 
     return difference; 
 
    } else { 
 
     return loop(difference - divider); 
 
    } 
 
    } 
 

 
    return loop(sum - divider); 
 
} 
 

 
alert(modulo(8, 5));