Javascript

[Javascript] 함수의 종류와 parameter ,argument

봄나물소녀 2021. 4. 11. 16:10

1. 함수의 종류

 

함수의 종류는 3가지가 있다. 

 

1) 이름이 있는 함수

 

2) 이름이 없는 함수

 

3) 화살표 함수

 

예제와 함께 살펴 보자.

 


 

(1) 기명 함수 (named function)

 

function greeting(){
    console.log("hi");
}
greeting(); // hi

 

파싱하는 단계에서 함수가 호출된다.

 

 

(2) 익명함수(unanonymous function)

var greeting = function(){
    console.log("hello");
}
greeting(); 						// hello

const greetingAgain = greeting; 	// 변수 할당 가능

함수의 이름이 따로 없고 변수명에 함수를 저장하는 함수이다.

그러므로 익명함수를 호출시 변수명을 함수명처럼 사용하면 된다.

이 아이는 런타임 환경에서만 함수가 호출된다.

그래서 함수가 선언되기 전에 호출이 된다면 가슴 아픈 Error 메시지를 받을 수 있다.

호출할 떈 괄호를 붙여서 이렇게 ---> 변수명()

 

let hello = function(){
	console.log("hello world");
}
hello(); 		// 익명함수를 변수명으로 호출. hello world 출력. 

 

그런데 익명함수는 왜 쓰는걸까?

익명함수는 함수 선언 순서에 따라 함수가 작동하지 않을 수 있다.

여러 개의 함수를 작업할 때 함수가 hoisting되지 않고 (쉽게 말해 문서의 맨 위로 함부로? 올라가지지 않는) 

함수 선언 -> 함수 호출의 단계를 따른다는 말이다.

그래서 갑자기 선언하지 않은 함수가 호출되는 등의 불상사를 막을 수 있다.

이것이 익명함수를 써야하는 이유이다.

 

* 기명함수와 익명 함수의 차이

둘의 차이는 브라우저가 읽는 순서의 차이에 있다.

기명함수는 브라우저가 런타임 환경 이전에도 선언이 가능한 함수입니다.
(함수 호출 -> 함수 선언 ==> 작동o)greeting(); // hi function greeting(){ console.log("hi"); }
greeting(); // hi

function greeting(){
    console.log("hi");
}

 

익명함수는 브라우저가 런타임 환경 이후에 동적으로 선언되는 함수입니다.  
(함수 호출 -> 함수 선언 ==> 작동x)
greeting(); // 결과 : Uncaught TypeError: greeting is not a function

var greeting = function(){
    console.log("hello");
}

hello? 노노

에러? 예스예스

 

(3) Arrow function (화살표 함수)

 

const simplePrint = () => console.log("simplePrint");

simplePrint();

/*
const simplePrint = function(){
console.log("simplePrint");}
*/


const add = (a,b) => {
return a+b;
}
console.log(add(2,3));

/*
const add = function(a,b){
console.log(a+b);}
*/

항상 익명함수로 표현하고 함수를 간단히 표현할 수 있는 장점이 있다.

한 줄이면 {}를 생략할 수 도 있고 좀 더 복잡한 로직이 들어간다면 {}를 추가하면 된다.

와우. Do more, write less!

 

 

2. Parameter 와 argument

 

 

💡Parameter(인자)

: 함수는 0개 혹은 하나 이상의 parameter를 가지고 시작합니다.

함수의 정의에서 전달받은 인수를 함수 내부로 전달하기 위해 사용하는 변수

 

💡Argument(인수)

: 함수는 인자와 함께 호출이 됩니다.

함수가 호출될 때 함수로 값을 전달해주는, 들어가는을 말합니다.

 

function a(arg){

}
a(1); 

위 코드에서 함수 a의 arg가 parameter 이고 a(1)의 함수a를 호출 할 떄 1이 argument입니다.

 

Primitive parameters : passed by value // value(primitive data type)값에 의한 전달.

Object parameters : passed by reference // 참조(tobject data type  e.g. array, function, objec)에 의한 전달.

-> why? 오브젝트는 reference로 전달되기 때문에 

* 함수 안에서 오브젝트의 값이 변경되면 그 변경된 사항이 그대로 메모리에 저장된다. 추후 변경된 사항 확인 가능.

 

function sum(par1, par2){   		 // parameter : par1, par2 
    return par1 + par2
}
console.log(sum(1, 2));        	 	 // argument : 1, 2

 

 

(1) Default parameter ( added in ES6)

 

function showMessage(message, from = 'unknown'){  // 인자값이 없을 때 입력 default 값 ' '

    console.log(`${message} by ${from}`);

} 

showMessage('hi!', 'venny')                       // hi! by venny
showMessage('hi!')                                // hi! by unknown

 

(2) Rest parameters (added in ES6)

 

function printAll(...args){               //...args : 배열을 나타냄.

    for(let i=0; i< args.length; i++){

        console.log(args[i]);

    }


or

    for(const arg of args){

        console.log(arg);

    }


or

    args.forEach((arg) => console.log(arg)); // (element) = (arg)

}

printAll('dream', 'coding', 'ellie');

forEach 함수 : 배열에 활용이 가능한 메서드. 파라미터로 주어진 함수배열 요소 각각에 대해 실행하는 메서드이다.

참고로 return 값은 없다.

 

(3) IIFE :

immidiately Invoked Function Expression

 

function hello(){
    console.log('IIFE');
}
hello();
//hello

(function hello(){
    console.log('IIFE!')
})();
//hello

함수 즉시 실행이 가능하다.

 

보고보고 또 보면 그땐 더 잘 이해가 가리라 믿는다.