JavaScript

arguments

함수에는 arguments라는 변수에 담긴 숨겨진 유사 배열이 있다. 이 배열에는 함수를 호출할 때 입력한 인자가 담겨있다. 아래 예제를 보자. 결과는 10이다.

function sum(){
    var i, _sum = 0;	
	for(i = 0; i < arguments.length; i++){
		document.write(i+' : '+arguments[i]+'<br />');
		_sum += arguments[i];
	}	
	return _sum;
}
document.write('result : ' + sum(1,2,3,4));

함수 sum은 인자로 전달된 값을 모두 더해서 리턴하는 함수다. 그런데 1행처럼 함수 sum은 인자에 대한 정의하가 없다. 하지만 마지막 라인에서는 4개의 인자를 함수 sum으로 전달하고 있다. 함수의 정의부분에서 인자에 대한 구현이 없음에도 인자를 전달 할 수 있는 것은 왜 그럴까? 그것은 arguments라는 특수한 배열이 있기 때문이다.

arguments는 함수안에서 사용할 수 있도록 그 이름이나 특성이 약속되어 있는 일종의 배열이다. arguments[0]은 함수로 전달된 첫번째 인자를 알아낼 수 있다. 또 arguments.length를 이용해서 함수로 전달된 인자의 개수를 알아낼 수도 있다. 이러한 특성에 반복문을 결합하면 함수로 전달된 인자의 값을 순차적으로 가져올 수 있다. 그 값을 더해서 리턴하면 인자로 전달된 값에 대한 총합을 구하는 함수를 만들 수 있다.

arguments는 사실 배열은 아니다. 실제로는 arguments 객체의 인스턴스다.

매개변수의 수

매개변수와 관련된 두가지 수가 있다. 하나는 함수.length, 다른 하나는 arguments.length이다. arguments.length는 함수로 전달된 실제 인자의 수를 의미하고, 함수.length는 함수에 정의된 인자의 수를 의미한다. 아래의 코드를 보자.

function zero(){
    console.log(
		'zero.length', zero.length,
		'arguments', arguments.length
	);
}
function one(arg1){
	console.log(
		'one.length', one.length,
		'arguments', arguments.length
	);
}
function two(arg1, arg2){
	console.log(
		'two.length', two.length,
		'arguments', arguments.length
	);
}
zero(); // zero.length 0 arguments 0 
one('val1', 'val2');  // one.length 1 arguments 2 
two('val1');  // two.length 2 arguments 1

 

댓글

댓글 본문
작성자
비밀번호
  1. 완료!
    완료! 감사합니다~
  2. 감사합니다~
  3. yihsang
    강의 잘 듣고 있습니다.
  4. 지영
    누가 자바스크립트 쉽다고 했어 ㅠ
  5. egoing
    만약 <input type="text" id="f">라는 폼이 있다면
    document.getElementById('f').value를 통해서
    값을 알아 낼 수 있습니다.
    대화보기
    • 자바초보
      안녕하세요 강의 잘 보고 있습니다.
      자바스크립트 관련 궁금증이 있어 문의드립니다.
      여기에 남기는게 맞는지 모르겠습니다.

      자바스크립트에서 리턴되는 값을 폼 내부에서 받을수 있는 방법이 있을까요??
      예를들어 자바스크립트 함수에서 리턴되는 값이 1 이라 가정을 하면
      폼 내부에 id 라는 네임을 가직 인풋박스로 함수에서 리턴하는 값을 받을수 있을까요??

      도움 부탁드립니다.
      감사합니다.
    • joo0914krs
      감사합니다
    • 이주환
      2016. 04. 24

      알아두면 좋지만 쓰는경우는 거이 없었던것 같네요.
    • JustStudy
      고맙습니다
    • 국제표준규격
      이건 알아두기만 하고 사용하면 안되겠네요. 큰 프로젝트에서는 많은 버그를 양산하겠어요.
    • Byeong Koo Kang
      c나 java에서 main argument는 있었지만, 함수마다의 argument 갯수를 세는건 못 본거 같은데.. 아닌가요??

      javascript는 정말.. 많은걸 해볼 수 있네요..
    • egoing
      sum은 함수고 _sum은 변수입니다.
      대화보기
      • Cho Jeaho
        sum과 _sum을 나눈것은 지역변수와 전역변수의 구별을 위해서 나눈것인가요?
      • 김경민
        다른 언어를하다가 자바스크립트하니까 좀 해깔리긴하네요 ㅋㅋ 자바스크립트는 너무 관대한것같아요
      • 고고
        ㅋㅋㅋㅋ 파라미터를 받도록 코딩을 안했는데 파라미터를 받을 수 있다니 ㄷㄷㄷ 혼란스럽다 ㅋㅋㅋ
      • 게임
        강의 잘 보았습니다. 짧은 시간에 압축적으로 잘 설명해 주시네요..
      • document.write
        자바스크립트 변수명 작성 규칙에 특수문자 기호중에는 _ 과 $가 사용 가능하고 다른 거는 사용불가라고 알고 있습니다. $sum 이나 _sum 해서 인자의 합을 저장하는 변수라는 것을 알려주고 sum()이라는 함수명과 충돌방지, 변수명은 작성규칙에 어긋나지 않는 범위내에서 마음대로 만들수 있지만 되도록이면 변수명을 봐도 어떤 값, 기능을 수행하는지 알수 있게끔 명시하는게 좋겠죠
        대화보기
        • ㄱㄷㅅㄷㄱ
          two 부분에 보면 전달되는 인자의 값이 'val1'에 1개가 있죠? 그리고 arguments가 1이에요
          그리고 함수에 선언된 two의 인자가 arg1,arg2 두개죠? 그리고 객체의 길이는 2이에요
          님 말이 맞을듯
          대화보기
          • 갈희
            그냥 sum을 하게되면 함수명과 중복되잖아요? ㅎㅎ
            그래서 _를 붙혀준거 같네요.
            대화보기
            • 한비
              제가 알기로는 보통 지역변수를 정의할때 _로 시작하곤 합니다.
              일종의 코딩관례라고 할 수 있습니다.
              대화보기
              • 하얀감
                sum 앞에 _는 왜 붙이는건가요?
              • 샤핀
                감사합니다. ^^. 어젠 초복이었는데 보신은 좀 하셨는지 모르겠습니다. 이고잉님 항상 건강하셔서
                좋은 강의 만들어 주셨으면 좋겠습니다.

                php수업까지 가려고 쭉 강좌를 독파하고 있는데, php수업까지 가게 되면 앞에서 들었던 html, css,
                javascript 내용을 다 잊어버릴까 걱정도 되지만 방대한 영역을 개념을 잡는다고 생각하고 꾸준히
                봐가고 있습니다. 이런 다양한 부분을 책으로 보려면 영역을 몰라 헤딩해가며 배워야하는 경우가 많은데,
                유기적으로 얽혀져 있는 강의를 보고 있으면,, 항상 대단하신 분이란 생각이 드네요. 다시 한번 감사드립니다 ^^
              • 나무마루
                감사합니다.
              • ㄴㄴㄴ
                그렇군요...
                답변 감사합니다.
                대화보기
                • egoing
                  오버로딩과는 조금 다릅니다. 오버로딩은 같은 이름이지만 원형에 따라서 여러 함수가 공존 할 수 있는 기능을 의미하고요. 자바스크립트는 동일 이름의 함수가 있다면 덮어쓰기 되기 때문에 오버로딩이 지원되지 않습니다.
                  대화보기
                  • ㄴㄴㄴ
                    함수의 오버로딩이라고 생각하면 되는 것인가요?
                  • marcia
                    좋은 정보 감사합니다~
                  • 초보
                    수정 된건가요?? 헷갈려서...ㅠㅠ
                    대화보기
                    • egoing
                      그러네요. 수정했습니다!
                      대화보기
                      • 진짜감사염
                        함수.length는 함수로 전달된 실제 인자의 수를 의미하고, arguments.length는 함수에 정의된 인자의 수를 의미한다.
                        이게 반대로 돼야 하는 거 아닌가여?
                      버전 관리
                      egoing
                      현재 버전
                      선택 버전
                      graphittie 자세히 보기