2016-05-19 65 views
1

我試圖編寫一個函數,它將函數作爲參數(儘可能多)並返回它們。函數funcArg應該返回'調用我'。我使用Array.prototype.slice.call(參數);創建一個數組,但我不知道如何調用該數組中的函數。有任何想法嗎?謝謝!!調用函數洞察函數/參數

var caller = function() { 
    return "Called "; 
}; 
var adder = function() { 
    return " me"; 
}; 
var funcArgs = function() { 
    var myArray = Array.prototype.slice.call(arguments); 
} 
funcArgs(caller); 
funcArgs(calleradder); 

回答

1

如果你有一個函數數組,你可以用forEach來遍歷它們。

var caller = function() { 
    return "Called " 
} 

var adder = function() { 
    return " me" 
} 

var funcArgs = function() { 
    var myArray = Array.prototype.slice.call(arguments); 
    myArray.forEach(function (fn) { 
    console.log(fn()) 
    }) 
} 

funcArgs(caller, adder); // "Called me" 

如果你想實際返回的值,而不是僅僅CONSOLE.LOG他們,你可以使用reduce返回串聯字符串(或任何其他)

var funcArgs = function() { 
    var myArray = Array.prototype.slice.call(arguments); 

    return myArray.reduce(function (acc, fn) { 
    return acc + fn() 
    }, '') 
} 
+0

非常感謝!你知道我將如何在這裏使用concat方法嗎? – learningcoding

+0

你想用'concat'做什麼?期望的結果是什麼? – azium

+0

將被返回的「被叫」和「我」被假設爲在一行中,就像被稱爲我反對在分開的行上 – learningcoding

2

你可以用做reduce

var funcArgs = function() { 
    var functions = Array.prototype.slice.call(arguments); 
    return functions.reduce(function(total, f) { 
    return total + f(); 
    }, ''); 
}; 

這種方式,如果你從一個函數數組開始。然後,我們逐個查看每個功能。然後我們調用該函數並將其附加到前一個函數的結果中。將其分解爲更簡單的代碼將如下所示:

var funcArgs = function() { 
    var functions = [caller, adder]; 
    var result = ''; 
    result += functions[0](); // caller(); 
    result += functions[1](); // adder(); 
    return result; 
}; 
+0

謝謝!然而,這個(最後一個)解決方案只有在我知道我會有多少個參數時纔會起作用。 – learningcoding

+1

@learningcoding這不是一個解決方案,他正在解釋第一種方法如何工作更詳細。 – azium

+1

@learningcoding最後一個不是解。這是當你調用'funcArgs(調用者,加法器)'時發生了什麼的解釋。在編寫這樣的代碼時,瞭解它的工作原理非常重要。 –