之前我问过这个问题,但有点模糊,措辞不好。
我有一个接收Action
s的对象,并将它们放入一个随时间推移的堆栈中。它执行堆栈中的第一个Action
直到完成,然后执行第二个,依此类推。有一个RepeatAction
可以接收其他Action
的数组,并以类似的方式执行它们多次。 (.repeat()
只是将新的RepeatAction
放入对象堆栈中。
以此为例:
object.repeat(10,[new LogAction(Math.random())]);
鉴于LogAction
仅接受参数并将其记录下来。当对象的repeat函数被调用时,它会将10 LogAction
放入其堆栈中,但它们都会记录相同的数字。我正在寻找的方式是它将记录10次不同的数字。
你可以说只是将Math.random作为一个函数传递,但是如果我想传入4 * Math.random()
该怎么办?
任何帮助?
答案 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
}