Javascript 학습노트의 함수 편(4):arguments 대상

2792 단어
모든 자바스크립트 함수는 자신의 역할 영역에서 특수한 변수인 arguments에 접근할 수 있습니다.이 변수는 함수에 전달되는 모든 매개 변수의 목록을 포함한다.arguments 대상은 하나의 그룹이 아닙니다.비록 문법적으로 그것은 수조와 같은 부분을 가지고 있지만, 예를 들어length 속성을 가지고 있다.하지만 Array에서 온 건 아니에요.prototype은 계승되어 왔지만, 실제로는 하나의 대상이다.따라서 우리는arguments에 대해push,pop,slice 등 수조를 직접 사용할 수 없다.그래서 이런 방법을 사용하기 위해서는 진정한 수조로 전환해야 한다.
배열로 변환
다음 코드는arguments 대상의 모든 요소를 포함하는 그룹을 되돌려줍니다.
Array.prototype.slice.call(arguments); 전환 속도가 매우 느리기 때문에 성능 요구가 엄격한 프로그램에서는 이렇게 하는 것을 권장하지 않는다.
전달 매개 변수
다음은 비교적 추천하는 방법으로arguments 대상을 한 함수에서 다른 함수로 전달하는 것이다.
 
  
function foo() {
    bar.apply(null, arguments);
}
function bar(a, b, c) {
    // do stuff here
}

또 하나의 교묘한 방법은 콜과 apply를 동시에 사용하여 묶음을 풀 수 있는 외부 방법을 신속하게 만드는 것이다.
 
  
function Foo() {}
Foo.prototype.method = function(a, b, c) {
    console.log(this, a, b, c);
};
// Create an unbound version of "method"
// It takes the parameters: this, arg1, arg2...argN
Foo.method = function() {
    // Result: Foo.prototype.method.call(this, arg1, arg2... argN)
    Function.call.apply(Foo.prototype.method, arguments);
};

함수형 참조와arguments 속성의 관계
arguments 대상은 자신의 속성과 함수의 인삼을 위해 Getter와setter 방법을 만들었습니다.따라서 함수의 형상을 수정하면 대응하는arguments 대상의 속성 값에 영향을 주고 반대로도 마찬가지다.
 
  
function foo(a, b, c) {
    arguments[0] = 2;
    a; // 2
    b = 4;
    arguments[1]; // 4
    var d = c;
    d = 9;
    c; // 3
}
foo(1, 2, 3);

성능 문제
arguments는 두 가지 상황에서만 생성되지 않습니다. 하나는 함수 내부에서 국부 변수로 성명되고, 다른 하나는 함수의 형삼으로 간주됩니다.다른 경우,arguments 대상은 항상 생성됩니다.Getter와setter 방법은 항상 ARguments 대상이 생성됨에 따라 만들어지기 때문에 ARguments를 사용하는 것은 성능 자체에 거의 영향을 주지 않습니다.그러나 Javascript의 성능에 심각한 영향을 줄 수 있는 상황은 바로arguments를 사용하는 것이다.callee.
 
  
function foo() {
    arguments.callee; // do something with this function object
    arguments.callee.caller; // and the calling function object
}
function bigLoop() {
    for(var i = 0; i < 100000; i++) {
        foo(); // Would normally be inlined...
    }
}

상기 코드에서 foo 함수는 더 이상 간단한 내연 확장이 아니다. 왜냐하면 그 자체와 호출자 (caller) 를 알아야 하기 때문이다.이것은 내연 확장이 가져오는 성능 향상을 상쇄할 뿐만 아니라 함수의 봉인성을 파괴한다. 함수 자체가 특정한 호출 배경에 의존해야 하기 때문이다.그러므로 가능한 한 arguments를 사용하지 않는 것을 권장합니다.callee.
이상은 Javascript arguments 대상에 대한 전부입니다. 어린 친구들은 철저하게 알고 있습니까? 간단하게 말하면
arguments는 함수의 매개 변수 대상(실제 전송된 매개 변수를 가리킨다)arguments.length는 함수의 매개 변수 대상의 길이를 가리키는arguments[i]는 i번째 매개 변수의 값을 가리킨다(첫 번째는 0)

좋은 웹페이지 즐겨찾기