2012-02-18 48 views
26

在Chrome中,當我在下面的一種類型console.logJavascript:「無限」參數的功能?

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter"); 

...它正確打印它,沒有任何錯誤或警告。我附加了更多參數,但它仍能正確打印出來。

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter"); 

我怎樣纔能有一個「無限」參數函數就像那樣?

回答

46

函數可以訪問稱爲arguments類似陣列的對象,其中包含他們收到

function print_my_arguments(/**/){ 
    var args = arguments; 
    for(var i=0; i<args.length; i++){ 
     console.log(args[i]); 
    } 
}; 

你也可以做相反的轉換(稱之爲給出的參數列表的功能)與應用方法的所有參數:

// These are equivalent: 
print_my_arguments(1,2,3); 
print_my_arguments.apply(null, [1,2,3]); 

// The first parameter to `apply` is the `this`. 
// It is used when the function is a method. 
foo.bar(1,2,3); 
var f = foo.bar; f.apply(foo, [1,2,3]); 

一些要點需要注意:

  1. arguments不是一個實際的數組,它沒有任何常用的數組方法(slice,join等)。你可以用下面一行將其轉換爲一個數組:

    var args = Array.prototype.slice.call(arguments); 
    
  2. 片也是有用的,如果你希望你的數組只包含收到的非命名參數:

    function foo(first_arg, second_arg /**/){ 
        var variadic_args = Array.prototype.slice.call(arguments, 2); 
    } 
    
  3. 不每個瀏覽器都可以處理任意數量的功能參數。上次我測試了這個,在Chrome和IE中,有大約200.000個參數之後有一個stackoverflow。如果您的函數可以接收任意數量的參數,請考慮將所有這些參數包裝在常規數組中。

  4. 那些/**/註釋出現在我的例子的參數列表中並不是強制性的。它們只是一個編碼慣例,我用它來標記可變參數函數並將它們與常規函數區分開來。

    // A quick glance would suggest that this function receives no 
    // parameters but actually it is a variadic function that gets 
    // its parameters via the `arguments` object. 
    function foo(){ 
        console.log(arguments.length); 
    } 
    
+0

大回答,+1的告誡,我沒看過他們跑的第一個。 – 2013-12-27 19:20:06

0

您可以使用參數數組:jsfiddle.net/kUnJ2/

+0

這是上一個答案的重複。將來,如果您可以提供替代答案或爲現有答案增加價值, – 2014-02-28 20:08:36