[javascript] 함수의 JavaScript 변수 개수

JavaScript에서 함수에 대해 “무제한”변수를 허용하는 방법이 있습니까?

예:

load(var1, var2, var3, var4, var5, etc...)
load(var1)



답변

물론, 그냥 arguments물건을 사용하십시오 .

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


답변

(대부분의) 최신 브라우저에서는 다음 구문을 사용하여 가변 개수의 인수를 사용할 수 있습니다.

function my_log(...args) {
     // args is an Array
     console.log(args);
     // You can pass this array as parameters to another function
     console.log(...args);
}

다음은 작은 예입니다.

function foo(x, ...args) {
  console.log(x, args, ...args, arguments);
}

foo('a', 'b', 'c', z='d')

=>

a
Array(3) [ "b", "c", "d" ]
b c d
Arguments
    0: "a"
    1: "b"
    2: "c"
    3: "d"
    length: 4

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters에 대한 설명서 및 추가 예제


답변

또 다른 옵션은 컨텍스트 객체에서 인수를 전달하는 것입니다.

function load(context)
{
    // do whatever with context.name, context.address, etc
}

이렇게 사용하세요

load({name:'Ken',address:'secret',unused:true})

이것은 원하는만큼 명명 된 인수를 추가 할 수 있다는 장점이 있으며, 함수는 적절하다고 판단되는대로 사용할 수 있습니다.


답변

나는 가장 역동적 인 Ken의 대답에 동의하며 한 걸음 더 나아가고 싶습니다. 다른 인수로 여러 번 호출하는 함수 인 경우 Ken의 디자인을 사용하지만 기본값을 추가하십시오.

function load(context) {

    var defaults = {
        parameter1: defaultValue1,
        parameter2: defaultValue2,
        ...
    };

    var context = extend(defaults, context);

    // do stuff
}

이 방법으로 매개 변수가 많지만 함수를 호출 할 때마다 매개 변수를 설정할 필요가없는 경우 기본값이 아닌 값을 지정하기 만하면됩니다. extend 메소드의 경우 jQuery의 extend 메소드 ( $.extend())를 사용하거나 직접 작성하거나 다음을 사용할 수 있습니다.

function extend() {
    for (var i = 1; i < arguments.length; i++)
        for (var key in arguments[i])
            if (arguments[i].hasOwnProperty(key))
                arguments[0][key] = arguments[i][key];
    return arguments[0];
}

컨텍스트 객체를 기본값과 병합하고 객체의 정의되지 않은 값을 기본값으로 채 웁니다.


답변

예, 이처럼 :

function load()
{
  var var0 = arguments[0];
  var var1 = arguments[1];
}

load(1,2);


답변

Ramast가 지적했듯이 rest 매개 변수 구문을 사용하는 것이 좋습니다.

function (a, b, ...args) {}

방금 … args 인수의 멋진 속성을 추가하고 싶습니다.

  1. 배열이며 인수와 같은 객체가 아닙니다. 이를 통해 맵 또는 정렬과 같은 기능을 직접 적용 할 수 있습니다.
  2. 모든 매개 변수를 포함하지는 않지만 전달 된 매개 변수 만 포함합니다. 예를 들어, args는 인수 3에 인수 3을 포함합니다.

답변

이미 언급했듯이 arguments객체를 사용하여 가변 개수의 함수 매개 변수를 검색 할 수 있습니다 .

동일한 인수로 다른 함수를 호출하려면을 사용하십시오 apply. arguments배열 로 변환 하여 인수를 추가하거나 제거 할 수도 있습니다 . 예를 들어이 함수는 콘솔에 로깅하기 전에 텍스트를 삽입합니다.

log() {
    let args = Array.prototype.slice.call(arguments);
    args = ['MyObjectName', this.id_].concat(args);
    console.log.apply(console, args);
}