var foo = function(){
//....
}
function foo(){
//....
}
위의 코드를 보면 첫 번째 함수는 foo 라는 변수에 익명함수가 할당되어 있고 두 번째 함수는 foo라는 이름을 가진 함수가 선언된 것이다. 변수에 할당되어 있는 함수를 함수표현식 이라고 부르고 별도의 할당 없이 선언된 함수를 함수선언문 이라고 부른다.
var add = function(){
//....
}
var add2 = function add(){
//....
}
위의 코드는 공부하면서 헷갈렸던 점이다. 첫 번째 함수표현식은 add라는 변수에 익명함수를 할당했으며, 참조할 수 있는 식별자가 add라는 변수명뿐이기 때문에 add(); 와 같이 호출할 수 있다.
그러나 두 번째 함수표현식은 뭘까? 대체 무엇으로 호출해야 할까? add2라는 식별자와 add라는 식별자가 동시에 존재한다....
=> 첫 번째 함수와 두 번째 함수는 모두 함수객체 안 name 프로퍼티가 add로 등록되어 있다. 당연히 첫 번째 함수는 add() 로 호출해야하고 add2는 왜 add()로 호출할 수 없는 것일까?
var add2 = function add(){
//....
console.log(this);
}
add2(); // window
똑같은 코드를 가져와봤다. 함수표현식에서의 this 는 window 객체를 가리킨다! 그러나 예외가 있다.
"use strict";
var add2 = function add(){
//....
console.log(this);
}
add2(); // undefined
바로 strict 모드 일 때의 경우다. 이 경우에는 this가 undefined로 출력된다. 함수선언문에서의 this도 마찬가지이다!
순수함수는 어떤 외부상태에 의지하지 않고, 매개변수를 통해 함수 내부로 전달된 인수에게만 의존해 값을 생성해 반환한다.
=> 즉 동일한 매개변수에 따라 동일한 결과값을 반환해낸다.
비순수함수는 외부상태의 영향을 받으며 외부에 선언된 변수나 객체의 값을 바꿀 수도 있다. 이걸 부수효과, 부작용(side-Effect) 라고 부른다!
정리하면 순수함수의 비순수함수의 차이점은 크게
로 나눌 수 있다!
일반적으로 순수 함수로 개발하는 것이 더 좋다고 한다. 그 이유는 순수 함수는 입력값이 같으면 항상 같은 결과를 반환하기 때문에 결과 예측이 쉽고 테스트하기도 용이하다. 또한 부작용, 부수효과(side effect)가 없기 때문에 코드의 의도가 분명해지고 유지보수가 쉽다는 특징이 있다.
반면에 비순수 함수는 입력값에 따라 결과가 항상 다를 수 있고, 외부 상태를 변경시키기 때문에 코드의 의도를 파악하기 어렵고 예측하기 어려울 수 있다. 따라서 버그를 발생시키기 쉽고, 코드를 수정하기 어렵고, 테스트하기도 어려울 수 있다.
하지만, 때에 따라서는 비순수 함수를 사용해야 하는 경우도 있다. 예를 들어, 파일 시스템이나 네트워크와 같은 외부 자원에 접근할 때는 순수 함수로는 처리할 수 없기 때문이다. 이 경우에는 함수 내에서 부작용이 발생하는 것이 불가피하다...