2012-02-18 2 views
26

В Chrome, когда я печатаю console.log в приведенной ниже:Javascript: «Бесконечные» параметры для функции?

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 не является фактическим массивом, и он не имеет обычных методов массива (срез, объединение и т. Д.). Вы можете преобразовать его в массив с помощью следующей строки:

    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 произошел переток stackoverflow после 200 000 аргументов. Если ваша функция может принимать произвольно большое количество аргументов, подумайте об упаковке всех этих аргументов в регулярном массиве.

  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 для предостережений, я их не читал и побежал первый. –

0

Вы можете использовать массив аргументов: jsfiddle.net/kUnJ2/

+0

Это повторение предыдущего ответа. В будущем это поможет, если вы можете предоставить альтернативный ответ или добавить значение к существующему ответу (ответам) –