Function
- fundamental building block in the program
- subprogram can be used muliple times
- performs a task or calculates a value
- Function declaration
: function name(param1, param2) { body... resturn; }
- one function === one thing
- naming : doSomething, command, verb ; 동사의 의미로 지음.
- 함수이름을 정하기 힘들면, 함수 이름이 여러가지 기능이 포함된 이름인지 확인한다. ( e.g. createCardAndPoint -> cratedCard, creatdPoint)
- *중요) function is object in JS
(함수는 object의 일종이다!! ex) 4번에서 printAll.length 처럼 object로서의 접근이 가능하다!)
function printHello() {
console.log('hello');
}
printHello();
function log(message ) {
console.log(message);
}
log('Hello@');
- Parameters
- premitive parameters (원시적인 인자값 ): passed by value
- object parameters : passed by reference
unction changeName(obj) {
obj.name = 'coder';
}
const ellie = {name : 'ellie'};
// 메모리 ellie변수안에 object의 refernce(주소)가 올라와있다.
changeName(ellie);
console.log(ellie);
- Default parameters (added in ES6 )
function showMessage(message,from = 'unknown') {
// 2번째 인자를 전달하지 않을때, 기본값으로 전달하는 값 = 'unknwon'으로 설정함
console.log('${message} by ${from}');
}
showMessage('Hi!');
- Rest parameters (added in ES6 ) ; 배열형태로 전달함
function printAll (...args) { // 01) ...args ; 인자를 받으면, 무조건 배열형태로 담는다.
for (let i = 0; i<args.length; i++){
console.log(args[i]);
}
for (const arg of args ) { // 02) args로 인자를 받아 배열로 담고, args를 반복하면서 arg에 하나씩 넣어준다.
console.log(arg);
}
args.forEach( (arg) => console.log(arg) ); // 03) forEach(); 배열함수!
}
printAll('dream', 'coding', 'ellie');
- Local scope ; 밖에서는 안이 보이지 않고, 안에서만 밖을 볼 수 있다!
let globalMessage = 'global'; //global variable
function printMessage() { // 블록안에서 변수선언시 -> 지역변수!
let message = 'hello'; // local variable
console.log(message);
console.log(globalMessage);
function printAll() {
console.log(message);
let childMessage = 'hello~~~!!';
}
}
printMessage();
//console.log(message);
- Return a value
function sum(a,b) {
return a+b;
}
const result = sum(1,2); // 3
console.log( 'sum : ' + result );
- Early return, early exit :
블록안에서 {} 코드를 길게작성하면 가독성이 떨어진다.
return 경우의 상황을 먼저 작성하여, return 하지 않을 상황을 뒤로 빼서, 길어지는 로직은 뒤로 빼자.
7_ 01) bad
function upgradeUser(user) {
if (user.point > 10){ //
// long upgrade logic...
}
}
7_ 02) good
function upgradeUser01(user) {
if (user.point <= 10){
//조건이 맞지 않은경우 or 값이 undefined일때 등의 경우에 먼저 빨리 return /exit 하는게 좋다!
return;
}
// long upgrade logic...
}