2014-11-15 177 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