각 JavaScript 함수는 범위 내의 특수 변수 인수에 액세스 할 수 있습니다. 이 변수에는 함수에 전달되는 모든 매개 변수의 목록이 포함되어 있습니다.
인수 객체는 배열이 아닙니다. 구문 적으로는 배열과 같은 장소가 있지만 예를 들어 길이 속성이 있습니다. 그러나 배열에서 상속되지 않습니다. 프로로 타입은 실제로 객체입니다.
따라서 푸시, 팝 또는 슬라이스 등과 같은 인수에 대한 일부 배열 메소드를 직접 사용할 수 없습니다. 따라서 이러한 방법을 사용하려면 실제 배열로 변환해야합니다.
배열로 변환하십시오
다음 코드는 인수 객체의 모든 요소가 포함 된 배열을 반환합니다.
Array.prototype.slice.call (인수);
변환 속도는 매우 느리기 때문에 성능이 엄격한 프로그램에서는 권장되지 않습니다.
매개 변수를 전달하십시오
다음은 인수 객체를 한 기능에서 다른 함수로 전달하는 것이 더 권장되는 방법입니다.
코드 사본은 다음과 같습니다.
함수 foo () {
Bar.Apply (NULL, 인수);
}
기능 막대 (A, B, C) {
// 여기서 물건을합니다
}
또 다른 영리한 방법이 있습니다.이 방법은 통화를 사용하여 undinding 외부 방법을 신속하게 생성하고 동시에 적용하는 것입니다.
코드 사본은 다음과 같습니다.
함수 foo () {}
foo.prototype.method = function (a, b, c) {
Console.log (this, a, b, c);
};
// "메소드"의 결합되지 않은 버전 생성
// 매개 변수를 사용합니다 : this, arg1, arg2 ... argn
foo.method = function () {
// 결과 : foo.prototype.method.call (this, arg1, arg2 ... argn)
function.call.apply (foo.prototype.method, arguments);
};
함수 매개 변수와 인수 속성 간의 관계
인수 객체는 자체 특성 및 기능 매개 변수 모두에 대한 getter 및 setter 메소드를 만듭니다.
따라서 함수의 공식 매개 변수를 수정하면 해당 인수 객체의 속성 값에 영향을 미치며 그 반대도 마찬가지입니다.
코드 사본은 다음과 같습니다.
기능 foo (a, b, c) {
인수 [0] = 2;
에이; // 2
b = 4;
논증 [1]; // 4
var d = c;
d = 9;
기음; // 3
}
foo (1, 2, 3);
성능 문제
인수는 두 가지 경우에만 생성되지 않으며, 하나는 함수 내부의 로컬 변수로 선언되며, 다른 하나는 함수의 공식 매개 변수로 사용됩니다. 다른 경우에는 인수 객체가 항상 생성됩니다.
getter와 setter 방법은 항상 인수 객체 생성으로 만들어지기 때문에 인수를 사용하는 것은 성능 자체에 거의 영향을 미치지 않습니다.
그러나 arguments.callee를 사용하는 JavaScript의 성능에 심각한 영향을 미치는 상황이 있습니다.
코드 사본은 다음과 같습니다.
함수 foo () {
arguments.callee; //이 함수 객체로 무언가를 수행합니다
arguments.callee.caller; // 호출 함수 객체
}
함수 bigloop () {
for (var i = 0; i <100000; i ++) {
foo (); // 일반적으로 상환됩니다 ...
}
}
위의 코드에서 FOO 함수는 더 이상 간단한 인라인 확장 기능이 아닙니다. 왜냐하면 자체와 발신자를 알아야하기 때문입니다. 이는 인라인 확장에 의해 가져온 성능 향상을 오프팅 할뿐만 아니라 함수 자체가 특정 호출 배경에 의존해야 할 수도 있기 때문에 함수의 캡슐화를 훼손합니다.
따라서 arguments.callee를 사용하지 않는 것이 좋습니다.
위는 JavaScript 인수 객체에 관한 것입니다. 철저히 알고 있습니까? 간단히 말해
인수는 함수의 매개 변수 객체를 나타냅니다 (실제 전달 된 매개 변수를 참조)
arguments.length는 함수의 매개 변수 객체의 길이를 나타냅니다.
인수 [i]는 i-th 매개 변수의 값을 나타냅니다 (첫 번째는 0입니다)