Javascript - Math.random作为参数

时间:2014-06-24 21:13:02

标签: javascript random

之前我问过这个问题,但有点模糊,措辞不好。

我有一个接收Action s的对象,并将它们放入一个随时间推移的堆栈中。它执行堆栈中的第一个Action直到完成,然后执行第二个,依此类推。有一个RepeatAction可以接收其他Action的数组,并以类似的方式执行它们多次。 (.repeat()只是将新的RepeatAction放入对象堆栈中。

以此为例:

object.repeat(10,[new LogAction(Math.random())]);

鉴于LogAction仅接受参数并将其记录下来。当对象的repeat函数被调用时,它会将10 LogAction放入其堆栈中,但它们都会记录相同的数字。我正在寻找的方式是它将记录10次不同的数字。

你可以说只是将Math.random作为一个函数传递,但是如果我想传入4 * Math.random()该怎么办?

任何帮助?

3 个答案:

答案 0 :(得分:2)

  

你可以说只是将Math.random作为函数传递,

是的,我愿意。

  

但是如果我想传入4 * Math.random()会怎样?

然后使用

代替Math.random
function() { return 4 * Math.random(); }

答案 1 :(得分:2)

代码需要调用函数(稍后)以获取不同的值。 e.g。

// pass in the `random` function - do not get a random number immediately!
object.repeat(10, [new LogAction(Math.random)])

// create and pass in a custom function that uses `random` itself
var rand4 = function () { return Math.random() * 4 }
object.repeat(10, [new LogAction(rand4)])

自" LogAction"我没有透露,我将举一个简单的例子来解决上述问题。

function LogAction (arg) {
    this.execute = function () {
        // If the supplied argument was a function, evaluate it
        // to get the value to log. Otherwise, log what was supplied.
        var value = (typeof arg === 'function') ? arg() : arg;
        console.log(value);                
    }
}

阅读How do JavaScript closures work?可能会增加对作为一等价值的函数的认识,而上述依赖于此。

答案 2 :(得分:2)

您可以传递返回随机结果的函数:

object.repeat(10,[new LogAction(function(){return Math.random();})]);

在LogAction函数中,您只需要检查参数是否为函数:

function LogAction(arg){
    var value = arg&& getType.toString.call(arg) === '[object Function]' ? arg() : arg;

    //log value    
}