2014-11-15 137 views
1

我有一个自定义函数,我们称之为funcJavascript函数参数评估

function func(someArg) { 
    return Math.random() + someArg; 
} 

我有Thing对象以及这些对象的数组都具有某种功能exec

var Thing = function() { 
    this.exec = function(n) { 
     console.log(n); 
    } 
} 

var arr = [new Thing(), new Thing(), new Thing()]; 

现在,我希望能够执行功能的阵列中的所有元素,应该为每个函数执行评估该函数的参数。一个例子:

function execAll(arg) { 
    arr.forEach(function(e) { e.exec(arg); }); 
} 

execAll(func(10)); 

这返回3次相同的值,因为func()针对的execAll呼叫计算一次,然后在每一个e.exec(arg)使用。我如何实现func对每个调用e.exec进行评估?

UPDATE

这将是非常好的,如果有同时使用的是支持的解决方案:

execAll(someFunc()); // invoked with a function 
execAll(20); // invoked with a plain value 

全段在这里:

var Thing = function() { 
 
    this.exec = function(n) { 
 
     console.log(n); 
 
    } 
 
} 
 

 
var arr = [new Thing(), new Thing(), new Thing()]; 
 

 
var func = function(someArg) { 
 
    return Math.random() + someArg; 
 
} 
 

 
function execAll(arg) { 
 
    arr.forEach(function(e) { e.exec(arg); }); 
 
} 
 

 
execAll(func(10));

+1

坏主意。使用两种不同的'exec'方法来做不同的事情。 – Bergi

+0

是的你是对的。我应该重新考虑我的整个设计。不过,我接受了Royi的答案,因为它首先解决了这个问题。 – Jonas

回答

1

替换此:

function execAll(arg) { 
    arr.forEach(function(e) { e.exec(arg); }); 
} 

execAll(function(){func(10)}); 

与此:

function execAll(arg) { 
     arr.forEach(function(e) { e.exec(typeof arg==='function'?arg():arg); }); 
    } 

    execAll(10); 

你应该发送的功能成为未来调用每个迭代。

你实际上在做的是立即调用它。

+0

我看不到我在哪里使用execAll(function(){func(10)});'。你的意思是'execAll(func(10));'?无论如何,我理解你的解决方案。如果'execAll()'的参数始终是一个函数,它就可以工作。但是有没有办法像'execAll(17)'一样包含结构呢?使用你的解决方案它会失败,因为'17()'不能被执行。我是否必须检查参数是否是函数,还是有其他解决方案? – Jonas

+0

这个怎么样? http://jsbin.com/javaxafawu/2/edit –

+0

这是一个更清洁的解决方案,我自己想到了这个问题,从你的回答中得到灵感。但是当尝试用'17'等简单值调用'execAll'时,它有同样的问题。它给出'未捕获的类型错误:数字不是函数'。我在上面描述了它。我**是否有**来检查参数是否是一个函数,如果是,请调用它? – Jonas

0

我会让函数func成为Thing的一个私有函数。这提供了封装..

var Thing = function() { 
    var func = function(someArg) { 
     return Math.random() + someArg; 
    }; 
    this.exec = function(n) { 
     console.log(func(n)); 
    }; 
} 

var arr = [new Thing(), new Thing(), new Thing()]; 

function execAll(arg) { 
    arr.forEach(function(e) { e.exec(arg); }); 
} 

execAll(10); 
+0

好点,但我的构建实际上是一个抽象的问题,我不能使用你的重构。 – Jonas