Javascript:" бесконечные " параметры для функции?

В Chrome, когда я типа console.log в одном ниже:

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");

как я могу иметь "бесконечную" функцию параметров, как эта?

3 ответов


функции могут получить доступ к массив-как объект, называемый arguments, который содержит все аргументы, которые они получили

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

и вы можете выполнить обратное преобразование (вызвать функцию, заданную списком аргументов) с помощью метода apply:

// 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. Slice также полезен, если вы хотите, чтобы Ваш массив содержал только неназванные аргументы, которые были получены:

    function foo(first_arg, second_arg /**/){
        var variadic_args = Array.prototype.slice.call(arguments, 2);
    }
    
  3. не каждый браузер поддерживает достаточно большое количество параметров функции. Последний раз, когда я тестировал это, в Chrome и IE был stackoverflow после некоторых аргументов 200.000. Если ваша функция может получить произвольно большое количество аргументов, рассмотрите возможность упаковки всех этих аргументов в вместо этого обычный массив.

  4. те /**/ комментарии, которые появляются в списках аргументов для моих примеров, не являются обязательными. Они просто кодирования конвенции, которые я использую, чтобы отметить мой variadic функции и отличать их от обычных функций.

    // 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);
    }
    

современный способ сделать это с помощью параметры отдыха:

function printArguments(...args) {
  args.forEach((arg, index) => {
    console.log(`Argument ${index}:`, arg);
  });
}

printArguments('hello', true, new Date());

С помощью ...args синтаксис, все параметры сохраняются в массив с именем args.

за исключением Internet Explorer, все браузеры уже отправляют эту функцию в своей новейшей версии.

Скрипка:https://jsfiddle.net/Lbf0stst/


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

function foo() {
    for (var i = 0; i < arguments.length; i++) {
        document.body.innerHTML += arguments[i];
    }
}


foo("There ", "are ", "as ", "much ", "arguments ", "as ", "you ", "want.");