Search

반응형

'function'에 해당되는 글 4건

  1. 2022.09.25 [자바스크립트]함수 이야기 8탄, 매개변수(parameters)와 인수(arguments) 1
  2. 2022.08.28 [자바스크립트]함수 이야기 6탄, 함수 중첩 이해하기.
반응형

여러분이 함수를 사용하려면 매개변수와 인수를 알아야 합니다.

매개변수(parameters, 파라미터), 인수(arguments, 아규먼트)의 의미 먼저 이해해 봅니다.

매개변수(파라미터)는 함수를 만들 때 어떤 값을 입력받을지 정하는 변수라 할 수 있습니다.

괄호() 안에 매개변수 이름을 지정해서 사용하면 됩니다.

1
2
3
function myFunc(a, b) {
    return a + b;
}
cs

myFunc는 함수 이름이고 괄호 안의 a, b가 매개변수가 됩니다.

인수(arguments)는 이렇게 함수를 정의할 때 선언한 a, b에 함수를 호출하면서 입력할 실제 값을 의미합니다.

myFunc(5, 6);

매개변수 a, b에 5, 6 값을 넣은 후 호출했습니다.

이때 5, 6이 인수입니다.

 

인수 사용하는 방법

인수는 객체입니다. 그리고 배열처럼 [i]를 붙여서 값을 가져올 수 있습니다.

함수를 호출할 때 설정된 매개변수로 인수를 전달하면 함수 내부에서 해당 인수 객체를

배열처럼 사용해서 값을 사용할 수 있습니다.

객체 이름은 arguments입니다.

arguments[i]; 

이렇게 함수 내에서 사용할 수 있습니다.

첫 번째 인수를 받으려면 arguments[0]로 i는 배열처럼 0으로 시작합니다.

중요한 점은 배열처럼이라는 표현을 썼는데요. 그 의미는 배열과 같은 객체는 아니라는 의미입니다.

사용법이 비슷해서 배열처럼이라는 표현을 사용하고 있습니다.

인수가 총 몇개인지 확인할 때 사용하는 속성은 length입니다.

var len = arguments.length;

1
2
3
4
5
6
7
function test(){
    for (var i = 0; i < arguments.length; i++){
        console.log(arguments[i]);
    }
}
 
test(12345);
cs

잠깐!

이 코드는 좀 이상합니다.

test() 함수는 매개변수가 1개도 선언이 되지 않았지만 7번 라인을 보면 1,2,3,4,5를 인수로 넘기고 있습니다.

보통 자바라면 오류가 발생했겠지만,

자바스크립트는 아무렇지도 않게 받아 줍니다.

그리고 해당 값은 선언된 매개변수가 없기에 사용할 수 없지만

arguments[]를 사용해서 순서대로 값을 꺼내서 사용할 수 있게 됩니다.

정말 황당하네요. ^^

매개변수가 정해졌지만 인수를 설정하지 않는다면 해당 매개변수는 함수 내에서 변수와 마찬가지로 undefined가 할당됩니다.

1
2
3
4
5
6
function test(a, b){
    console.log(a);
    console.log(b);
 
}
test(1);
cs

위 예제는 b 매개변수에 값을 넣지 않고 6번 라인처럼 호출을 한다면 undefined가 출력됩니다.

다르게 생각해 본다면 매개변수가 만들어지면 기본으로 undefined가 할당되어 있다고 생각하면 됩니다.

만약 b 값에 무조건 인수가 할당되어야 하고 undefined가 안되어한다면 기본값으로 설정할 수 있습니다.

test(a, b = 0)

이처럼 b 값이 필수여야 하며 기본(디폴트)으로 값이 무조건 있어야 한다면

그래서 사용자가 호출할 때 누락했다면 기본으로 0을 할당하는 방법으로 선언할 때 사용하면 됩니다.

 

나머지 매개변수 사용하는 방법

1
2
3
4
5
6
7
function test(a, ... others){
    console.log(a);
    console.log(others[0]);
    console.log(others[1]);
}
 
test('a'12);
cs

마지막으로 나머지 매개변수를 사용하는 방법을 알아봅니다.

위 예제를 보면... 뒤에 매개변수를 사용했습니다.

정해지지 않은 수만큼 인수를 받아야 하는 경우 위 예제처럼 점 3개를 사용하고 매개변수를 사용하면 됩니다.

해당 매개변수는 함수 내에서 배열로 사용할 수 있습니다.

자바스크립트는 정말 유연한 프로그램입니다.

그렇기에 더 자세히 살펴보면서 충분히 이해하고 사용한다면

다양한 기능을 사용할 수 있을 겁니다.

또한 자바스크립트를 깊이 공부하면서 다른 프로그램 언어 또한 깊이가 더해지는 느낌이 든답니다.

하나를 하더라도 제대로 전문가가 되어야 한다는 마음으로

열심히 읽고 코딩하면서 실력을 키워나가 봅니다.

반응형
반응형

안녕하세요. 신기한 연구소입니다.

이번 포스팅은 함수 중첩에 대한 이야기입니다.

자바스크립트는 함수를 만들 때 함수 내 함수를 또 선언할 수 있습니다.

이를 함수를 중첩할 수 있다고 표현하는데요.

어떤 함수를 선언하고 그 내부에 다른 함수를 선언한다는 의미로 외부 함수, 내부 함수라는 용어를 사용합니다.

 

중첩된 함수

내부 함수는 외부 함수내 포함이 되며 외부 함수 내에서만 사용이 가능합니다.

즉 폐쇄된 함수인데 자바스크립트에서 클로저(closure)를 형성하는 구조입니다.

내부 함수는 외부 함수에서만 호출할 수 있습니다.

이 내부 함수는 외부 함수의 블록 범위의 변수와 결합해서 클로저(closure)를 

형성할 수 있는데 클로저는 다시 자세히 포스팅하겠습니다.

쉽게 이해하자면 내부 함수가 자신을 포함(관리)하는 외부 함수의 인수나 변수를

물고 외부 함수의 수명이 끝났음에도 물고 있는 외부 함수의 변수를 내부 함수가

반환하지 않고 가지고 있으면서 폐쇄시킨다는 의미입니다.

중요한 것은 내부 함수는 자신을 품고 있는 외부 함수의 인수나 변수에 

접근해서 사용할 수 있지만,

외부 함수는 내부 함수의 인수나 변수에 접근할 수 없다는 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
function outer(a){
    var oa = 'out';
 
    function inner(i) {
        var ia = 'in';
        return oa + "==" + i;
    }
    console.log(ia);
    return inner(a);
}
 
console.log(outer('ok'));
cs

이번 예제를 보면 외부 함수 outer와 내부 함수 inner를 선언하고 활용하는 것을 볼 수 있습니다.

하지만 이 예제는 오류가 납니다.

이유는 8번 라인이 문제입니다.

외부 함수 outer에서 내부 함수 inner의 변수인 ia를 사용했기 때문입니다. 내부 함수는 외부 함수의 변수인 oa를 사용할 수 있지만 외부 함수는 내부 함수의 변수에 접근할 수 없기에 8번 라인처럼 사용하면 오류가 발생하게 됩니다. 정의되지 않은 변수라는 오류가 발생하는데 외부 함수에서는 없는 변수를 사용했기 때문에 일어나게 됩니다.

 

그럼 내부 함수 내부에는 또 다른 함수를 만들 수 있을까요?

자바스크립트는 내부 함수 내에도 다시 함수를 정의할 수 있습니다. 중첩이 여러 번 되는 다중 중첩이 가능하다는 의미입니다. 하지만 너무 깊은 단계로 중첩이 이루어진다면 관리하기 불편할 수도 있답니다. 그래서 꼭 필요한 경우에만 이해하기 쉽도록 잘 정리해서 구현해야 하겠지요.

1
2
3
4
5
6
7
8
9
10
function stepOne(a){
    function stepTwo(b){
        function stepThree(c){
            console.log( a + b + c);        
        }
        stepThree(5);
    }
    stepTwo(3);
}
stepOne(2);
cs

 이 결과는 10이 나옵니다.

이렇게 함수 내부에 함수를 선언하고 또다시 그 내부에 함수를 선언할 수 있습니다.

이를 다중 중첩이라고 합니다.

주의할 점은 접근할 수 있는 범위(스코프, scope)입니다.

stepThree는 그 상위인 stepTwo, stepOne의 범위 내 모두 접근이 가능합니다.

이것을 체이닝 한다고 합니다. 체인처럼 연결된 고리를 따라서

위로 접근할 수 있다는 의미입니다.

하지만 stepOne은 stepTwo와 stepThree에 접근할 수 없습니다.

stepTwo는 stepOne은 접근 가능하지만 stepThree는 접근할 수 없습니다.

stepThree는 stepTwo와 stepThree를 폐쇄하게 됩니다.

즉 클로저를 형성한다는 의미입니다.

클로저라는 용어가 자주 나오는데 

다음 포스팅에서 클로저에 대해 자세히 다뤄보겠습니다.

자바스크립트는 함수 언어라 해도 무방할 정도로

함수가 중요한 역할을 합니다.

일급객체이기도 한 함수는

자바스크립트로 프로그래밍하는데

정말 중요한 역할을 하기 때문에

다양한 기능과 특징을 잘 이해해서

실제 코딩 시 멋지게 사용하면 좋겠네요.

 

함수 이야기로 6탄을 만들었지만 아직도 

함수에 대한 이야기는 남아있습니다.

모두 즐 코딩하세요.

반응형