728x90
320x100
Function
-기본적인 빌딩블럭. (fundamental building block in the program)
-subprogram 이라고도 불리며 여러번 재사용이 가능함
- 한가지의 task 나 값을 계산하기위해 쓰여짐
1. Function 선언하기
function name(param1, param2){
body...
return;
}
-하나의 함수는 한가지 일만 하도록 만들어야함
-함수의 이름을 작성할땐 동사형태로 지정하기.
e.g. createCardAndPoint -> createCard, creatPoint 처럼 세분화 하는게 함수를 깨끗하게 만들 수 있다.
-js에서 function은 object 이다. 그렇기 때문에 함수를 변수에다 할당할 수 있고 파라미터로 전달이 되고 함수를 리턴할 수 있다.
//<함수선언>
function printHello(){
consol.log('hello');
}
//<함수호출>
printHello();
2. parameters (변수)
- premitive parameters는 값이 메모리에 그대로 저장되어서 값이 전달이 됨.
- object parameters는 메모리에 레퍼런스로 저장되어서 레퍼런스가 전달됨
function changeName(obj){
obj.name = 'coder';
}
const Tom = { name: 'Tom'};
changeName(Tom);
console.log(Tom); //name: 'coder'로 변경됨
3. default parameters (='')
function showMessage(message, from = 'unKnown'){ // ='' 으로 디폴트값 설정
console.log(`${message} by ${from}`);
}
showMessage('Hi!'); // from 값은 안적혀 있으므로 디폴트값인 'unKnown'으로 대체되어 출력
4. Rest parameters (...)
function printAll(...args){ //... 쓰면 배열형태로 전달됨
for(let i=0 ; i< args.length ; i++){
console.log(args[i]);
}
//또는 간단하게
for(const arg of args){ //for( of )를 이용
console.log(arg);
}
//로도 쓰임
//더간단하게는
args.forEach((arg) => console.log(arg));
//로도 쓰임
}
printAll('apple', 'banana', 'tomato');
5. Local scope (밖에서는 안이 보이지 않고 안에서만 밖을 볼 수 있다.)
let globalMessage = 'global' // 전역 변수
function printMessage(){
let message = 'hello';
console.log(message); //{}안에 감싸진것은 지역변수
console.log(globalMessage);
function printAnother(){
console.log(message);
let childMessage = 'hello';
}
console.log(childMessage); //childMessage는 자식요소에 있으므로 밖에서 호출하면 오류가남.
}
printMessage();
6. Return a value
-파라미터로 전달받은 값을 계산하여 리턴으로 반환함
-계산이 안되는 값들은 undefined로 되기때문에 생략가능
function sum(a, b){
return a + b;
}
const result = sum(1, 2); // 3
7. Early return, early exit
상황)유저의 포인트가 10이상일 경우에만 업그레이드를 하는 로직이 있다면..
나쁜 예
function upgradeUser(user){
if (user.point > 10){
//(업그레이드 내용 블라블라)
// 이 블럭안에 로직을 많이 작성하게 되면 가독성이 떨어짐.
}
}
좋은 예
function upgradeUser(user){
if (user.poin <= 10){
return; // 빠르게 종료하고
}
// 블럭 밖으로 조건이 맞을때만 필요한 로직들을 실행하는것이 낫다.
// (업그레이드 내용 블라블라)
}
즉, 조건이 맞지 않는경우 or 값이 undefined 인 경우 또는 값이 -1인 경우 빨리 리턴을 하고
필요한 로직들은 그 뒤에 작성하는 하는것이 좋다.
First-class function
-function are treated like any other variable
-can be assigned as a value to variable
-can be passed as an argument to other function
-can be returned by another function
1. function expression
-a function declaration can be called earlier than it is defiend. (hoisted)
-a function expression is created when the execution reaches it.
const print =function (){ // 함수이름이없는 경우 anonymous function
consol.log('print');
};
print(); // print 출력
const printAgain = print;
printAgain(); //마찬가지로 print 출력
const sumAgain = sum; // 미리 선언해도 출력이됨(호이스팅)
consol.log(sumAgain(1, 3));
2. Callback function using function expression
예시)랜덤퀴즈만들기
1단계: 펑션 만들기
function randomQuiz(answer, printYes, printNo){
if(answer === 'love you'){
printYes(); //정답이 맞으면 printYes 라는 콜백 함수 호출
}else{
printNo();
}
}
2단계: 콜백선언 만들기
//(anonymous function)
const printYes = function (){
consol.log('yes');
};
//(named function:네임드 펑션을 쓰는 이유는 디버깅을 할때 함수의 이름이 나오게 하기위해서
//또는 함수 안에서 또다른 함수를 호출할때 쓰인다.)
const printNo = function print(){
consol.log('no');
};
3단계: 확인하기
randomQuiz('wrong', printYes, printNo); //오답인 경우 printNo로 콜백
randomQuiz('love you', printYes, printNo);//정답인 경우 printYes로 콜백
3. Arrow function
-always anonymous 항상 이름이 없음
화살표함수 만드는법: function을 지우고 ()뒤에 => 넣고, {} 도 지워줌, 한줄일땐 return도 생략 가능
const simplePrint = function (){
consol.log('simplePrint!')
}
//화살표함수로 바꿔주면
const simplePrint = () => consol.log('simplePrint!')
4. IIFE : immediately Invoked Function Expression
-함수를 선엄합과 동시에 바로 호출하고 싶을때 사용
요즘은 사용을 잘안하지만 바로 값을 보고싶을때 사용한다.
// 함수전체를 ()로 묶고 끝에 ();를 붙여서 호출!
(function hello(){
consol.log('IIFE');
})();
728x90
320x100
'front-end > JavaScript' 카테고리의 다른 글
[JS]05-object(for..in, for..of 등) (0) | 2022.02.25 |
---|---|
[JS]04-Class(클래스 만들기, 게터와 세터, static 등) (0) | 2022.02.25 |
[JS] 02-operator (연산, 반복문, for, while, swich 등) (0) | 2022.02.23 |
[JS ]01-variable (var와 let차이, const, primitive 타입 등) (0) | 2022.02.23 |
[JS] html에서 script를 읽는 다양한 방식 (async와 defer) (0) | 2022.02.23 |
댓글