들어가기전에 잠깐! 🤔
함수도 역시 Object 중 하나 이기 때문에, 함수가 생성되면 그 함수의 이름 자체는 그 함수 로직이 담겨있는 주소를 가리키고 있다. 즉 함수에 이름에는 reference가 들어있고, 그 주소에 함수의 로직이 담겨있다 🙂
함수 네이밍
naming : doSomething, command, verb
e.g. createCardAndPoint => createCard , createPoint 로 분리하는게 좋음
함수 이름이 짓기 어렵다면, 그 함수가 여러 일을 하고 있는게 아닌지 생각해볼것
// 1. function declaration // function name (param1, param2){return;} // 하나의 함수는 하나의 일을 하는게 좋다 // 자바스크립트에서의 함수는 object로 간주되기 때문에 변수에 할당거나 파라미터로 전달, 함수를 리턴할 수도 있다.
function log(message : string) : number { console.log(message); return 0; }
// 2. Parameters // premitive parameters : passed by value (변수로써 할당되는 파라미터는 값으로 전달) // object parameters : passed by reference (object는 메모리 참조값으로써 전달) function changeName(obj){ obj.name = 'coder'; } const dylan = {name:'dylan',age:'28'}; changeName(dylan); console.log(dylan.name); // coder
// 3. Default parameters (added in ES6) function showMessage(message, from = 'unknown'){ console.log(`${message} by ${from}`); } showMessage('Hi'); // from 에 파라미터가 전달되지 않더라도, 디폴트로 설정한 'unknown' 으로 출력된다
// 4. Rest parameters (added in ES6) // '...' 으로 파라미터를 선언하면 배열의 형태로 전달받는것이 된다. function printAll(...args){ for (let i = 0; i < args.length; i++){ console.log(arg[i]); } for (const arg of args) { console.log(arg); } args.forEach((arg) => console.log(arg)); } printAll('dev','coding','dylan');
// 5. Local scope let globalMessage = 'global'; // global variable function printMessage(){ let message = 'hello'; console.log(message); //local variable console.log(globalMessage); // 출력가능 function printAnother(){ console.log(message); //출력 가능 let childMessage = 'hello'; } console.log(childMessage); // 출력 불가능 } // 이렇게 중첩된 함수에서 자식의 함수가 부모 함수의 변수에 접근 가능하게 하는것이 '클로저'
// 6. return a value function sum(a,b){ return a+b; } const result = sum(1,2); //3 //함수에 return값이 생략되어있는건 return undefined; 이다.
Function expression
// 1. Function expression // function declaration can be called earlier than it's defined (hoisted) // function expression is created when the execution reaches it. print(); // 호이스팅 안됨 const print = function(){ //anonymous function console.log('print'); }; print() // print 출력 sum(1,2); //호이스팅 됨. 에러 발생 x function sum(a,b){ console.log(a+b); }
// 2. Callback function using function expression function randomQuiz(answer, printYes, printNo){ if(answer === 'love you'){ printYes(); }else { printNo(); } } //anonymous function (함수에 이름이 없는것) const printYes = function(){ console.log('Yes'); }; // named function (함수에 이름이 있는것) // 디버깅할때 사용 (stack traces에 함수 이름 노출) // recursions 할때 사용 const printNo = function print(){ console.log('No'); //print(); // recursions }; randomQuiz('wrong',printYes,printNo); randomQuiz('love you',printYes,printNo);
Arrow function
// Arrow function // 항상 anonymous function 이다. //일반적인 anonymous function const simplePrint = function(){ console.log('simplePrint!'); } //arrow function const simplePrint = () => console.log('simplePrint!'); const add = (a,b) => a+b; // a,b를 받아서 a+b를 리턴 const simpleMultiply = (a,b)=>{ //do something more return a*b; }; //여러 로직이 동작해야한다면 블럭을 사용해도 됨
IIFE (Immediately Invoked Function Expression)
(function hello(){ console.log('IIFE'); })(); // 원래는 선언후 호출을 해줘야하지만, 호출 없이 바로 실행시키고 싶을때 사용