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 인수의 멋진 속성을 추가하고 싶습니다.
- 배열이며 인수와 같은 객체가 아닙니다. 이를 통해 맵 또는 정렬과 같은 기능을 직접 적용 할 수 있습니다.
- 모든 매개 변수를 포함하지는 않지만 전달 된 매개 변수 만 포함합니다. 예를 들어, 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);
}