1. 일급함수 : 함수 변수 + 함수 파라미터 + 함수 반환
var expression = function() {
console.log('hello');
}
expression();
// 출력값
// hello
var array = [1, 2, 3, 4];
var parameter = (element) =>{
return element * 10;
}
var calcArray = array.map(array);
console.log(calcArray);
// 출력값
// [10, 20, 30, 40]
function returnValue(unit){
return (parameter) =>{
console.log(parameter * unit);
}
}
var returned = returnValue(10);
returned(1230);
// 출력값
// 12300
이 코드의 핵심은 함수가 다른 함수를 반환하고, 반환된 함수가 자신이 생성될 때의 환경을 '기억'하는 클로저의 개념을 활용한다는 점, 이를 통해 unit 변수는 returned 함수가 호출될 때까지 그 값이 유지됩니다.
2. 순수함수
정직하게 일정 값(파라미터)을 넣으면, 일정한 값(반환값)이 나오며, 프로그램의 어느것도 건들지 않는다는 특징을 지닌다.
var c = 3;
function sideEffect(a,b){
console.log(a + b + c);
}
sideEffect(1, 2);
var c = 5;
sideEffect(1, 2);
// 출력값
// 6
// 8
var object = {
name : "Kong",
age : 10
}
function sideEffect(){
object.name = "Baron"
}
sideEffect();
console.log(object);
// 출력값
// {name : "Kong", age : 10}
// object는 참조주소를 가지고 있으므로
// name 속성의 값이 변환된다.
var object = {
name : "Kong",
age : 10
}
function sideEffect(object){
object.name = "Caron"
}
sideEffect(object);
console.log(object);
// 출력값
// {name : "Caron", age : 10}
// object는 참조주소를 가지고 있으므로
// copied는 object와 주소가 같다.
// name 속성의 값이 변환된다.
var object = {
name : "Kong",
age : 10
}
function sideEffect(object){
var copied = object
copied.name = "Daron"
return copied
}
var manipulated = sideeffect(object);
console.log(manipulated);
console.log(object);
manipulated == object
// 출력값
// {name : "Daron", age : 10}
// {name : "Daron", age : 10}
// true
// object는 참조주소를 가지고 있으므로
// copied는 object와 주소가 같다.
// name 속성의 값이 변환된다.
var object = {
name : "Kong",
age : 10
}
function noSideEffect(object){
var copied = Object.assign({}, object)
copied.name = "Daron"
return copied
}
var manipulated = noSideEffect(object);
console.log(manipulated);
console.log(object);
manipulated == object
// 출력값
// {name : "Daron", age : 10}
// {name : "Kong", age : 10}
// false
// Object.assign()메서드를 사용하여
// 값을 복사하는 얕은 복사를 진행한다.
var object = {
name : "Kong",
age : 10,
address : 'Earth',
}
var copied = Object.assign({}, object)
copied.name = "Baron"
console.log(object);
console.log(copied);
object.address.location = 'Moon'
console.log(object);
console.log(copied);
// 출력값
// { name: 'Aaron', age: 10, address: { location: 'Earth' } }
// { name: 'Baron', age: 10, address: { location: 'Earth' } }
// { name: 'Aaron', age: 10, address: { location: 'Moon' } }
// { name: 'Baron', age: 10, address: { location: 'Moon' } }