2011-04-14 4 views
1

아래의 함수 multiply에는 콜백 함수 "addOne"이 전달됩니다. 함수 곱하기 [3,5,7]을 반환합니다.JavaScript "arguments"- 다른 매개 변수를 사용하는 함수 전달

콜백 함수 addOne은 multiply 함수의 인수 중 하나이므로 multiply 함수의 인수가 모두 2로 곱해 졌기 때문에 콜백 함수 자체 (즉 addOne)에 2가 곱 해지는 이유는 무엇입니까? 즉, 함수가 숫자가 아니기 때문에 [3,5,7]을 반환하는 대신에 [3,5,7, NAN]을 반환 할 것으로 예상 했습니까?

JavaScript 인터프리터는 어떻게 든 2를 곱하지 않는 것을 알고 있습니까?

function addOne(a) { 
return a + 1; 
} 

function multiply(a,b,c, callback) { 
    var i, ar = []; 
    for (i = 0; i < 3; i++) { 
     ar[i] = callback(arguments[i] * 2); 
    } 
    return ar; 
} 



myarr = multiply(1,2,3, addOne); 
myarr; 

답변

4

루프의 상태가 콜백 (마지막 요소)를 첨자 않음을 의미 <3 (도니는 다르게)이기 때문입니다. 당신과 같이 인수를 항상 콜백에게 첫 번째 인수를 결정, 분할 고려해야한다

...

var argumentsArray = Array.prototype.slice.call(arguments), 
    callback = argumentsArray.shift(); 

jsFiddle. 그런 다음

, callbackcall(), apply() 또는 일반 ()으로 호출 할 수있는 콜백을 가지고 있으며, argumentsArray는 적절한 배열로 당신의 인수의 나머지를 가지고있다.

+0

네, 감사합니다. – mjmitche

+0

나는 "호출"이 무엇을하는지 일반적으로 알고 있지만, 작성한 예제 코드에서 정확히 어떻게 작동하는지 설명 할 수는있다. 고맙습니다. – mjmitche

+0

@mjmitche'arguments' 변수는 속성과 같은 배열을 노출하지만 배열이 아닌 객체입니다. 'shift()'를 호출하기 위해서는 실제 배열로 그것을 필요로합니다. 이를 위해서, 우리는 arguments 배열에'array'의'slice()'를 호출하고,'call()'을 사용하여 객체를'this'로 전달할 수 있습니다. 인수없이'slice() '를 사용하면 객체의 복사본을 배열 (또는 표준 배열에서 사용되는 경우 배열의 복사본)으로 반환합니다. – alex

0

이 줄 for (i = 0; i < 3; i++) {은 (는) 사용자를 보호하고 있습니다.

만 처음 3 개 인수에 대한 루프를 실행하고 있기 때문에이 callback 인수를

0

안타하기 전에 중지합니다. i < 3 회 i = 0, i = 1, i = 2로 실행

관련 문제